Aggiorna un elemento json nel tipo di dati json


14

Non riesco a capire come posso aggiornare un elemento in un tipo di dati PostgreSQL 9.3.

Il mio esempio:

CREATE TABLE "user"
(
  id uuid NOT NULL,
  password character varying(255),
  profiles json,
  gender integer NOT NULL DEFAULT 0,
  created timestamp with time zone,
  connected timestamp with time zone,
  modified timestamp with time zone,
  active integer NOT NULL DEFAULT 1,
  settings json,
  seo character varying(255) NOT NULL,
  CONSTRAINT id_1 PRIMARY KEY (id)
)
WITH (
  OIDS=TRUE
);
ALTER TABLE "user"
  OWNER TO postgres;

La parte json in "profili"

{
    "Facebook": {
        "identifier": "xxxxxxxxxxx",
        "profileURL": "none",
        "webSiteURL": "none",
        "photoURL": "none",
        "displayName": "test2 test2",
        "description": "none",
        "firstName": "test2",
        "lastName": "test2",
        "gender": 2,
        "language": "none",
        "age": "none",
        "birthDay": "none",
        "birthMonth": "none",
        "birthYear": "none",
        "email": "test@test.com",
        "emailVerified": "none",
        "Added": null,
        "phone": "none",
        "address": "none",
        "country": "none",
        "region": "none",
        "city": "none",
        "zip": "none"
    },
    "Google": {
        "identifier": "xxxxxxxxxxxxxxxxxxxxxx",
        "profileURL": "none",
        "webSiteURL": "none",
        "photoURL": "none",
        "displayName": "test2 test2",
        "description": "none",
        "firstName": "test2",
        "lastName": "test2",
        "gender": 2,
        "language": "none",
        "age": "none",
        "birthDay": "none",
        "birthMonth": "none",
        "birthYear": "none",
        "email": "test@test.com",
        "emailVerified": "none",
        "Added": null,
        "phone": "none",
        "address": "none",
        "country": "none",
        "region": "none",
        "city": "none",
        "zip": "none"
    }
}

Sto usando x-edit per il frontend e speravo che qualcosa del genere funzionasse, ma non:

UPDATE public.user 
SET "profiles"->'Facebook'->'social'->'facebook' = 'test' WHERE` id='id'

Non riesco a trovare alcuna informazione su come aggiornare un tipo di dati JSON.

Risposte:


7

Poiché è solo una stringa, potresti essere in grado di eseguire una semplice modifica / eliminazione di un nodo con la regex_replacefunzione.

Ad esempio, è così che di recente ho eliminato un determinato nodo JSON in una tabella (tutte le righe):

UPDATE my_db.my_table
SET my_column = (regexp_replace(my_column::text, ',"some_json_node":(.*),', ','))::json
WHERE NOT my_column IS NULL

Nota, per tutti i miei dati JSON, mantengo un "version":"(n).(n)"nodo (cioè versione dello schema) nell'oggetto. In questo modo posso aggiornare oggetti conformi a una versione specifica. Le tue esigenze potrebbero non essere così complesse, ma se lo sono, sicuramente aiuta.


Ho bisogno di questo per un oggetto json come col nome height = {'unit': 'cms', 'value': 150}
Rahul Dapke

3

Penso che dovrai aggiornare il campo completo su Postgres 9.3, almeno questo è ciò che mi dice la documentazione.

L'aggiornamento di singoli elementi in un documento JSON avverrà in 9.4 se non sbaglio.


2

Prova questo

UPDATE Tablename
SET columnname = replace(columnname::TEXT,'"name":','"my-other-name"')::jsonb 
WHERE id = 1;

Ho bisogno di questo per un oggetto json come col nome height = {'unit': 'cms', 'value': 150}
Rahul Dapke,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.