Aktualisieren Sie ein json-Element im json-Datentyp

14

Ich kann mir nicht vorstellen, wie ich ein Element in einem PostgreSQL 9.3-Datentyp aktualisieren kann.

Mein Beispiel:

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;

Der json Teil in "Profilen"

{
    "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": "[email protected]",
        "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": "[email protected]",
        "emailVerified": "none",
        "Added": null,
        "phone": "none",
        "address": "none",
        "country": "none",
        "region": "none",
        "city": "none",
        "zip": "none"
    }
}

Ich benutze x-edit für das Frontend und ich hatte gehofft, dass so etwas funktionieren würde, aber es funktioniert nicht:

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

Ich kann anscheinend keine Informationen zum Aktualisieren eines json-Datentyps finden.

Sebastien Deschamps
quelle

Antworten:

7

Da es sich nur um eine Zeichenfolge handelt, können Sie möglicherweise einen Knoten mit der regex_replaceFunktion einfach ändern / löschen .

So habe ich beispielsweise kürzlich einen bestimmten JSON-Knoten in einer Tabelle (alle Zeilen) gelöscht:

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

Beachten Sie, dass ich für alle meine JSON-Daten einen "version":"(n).(n)"Knoten (dh eine Schemaversion) im Objekt behalte . Auf diese Weise kann ich Objekte aktualisieren, die einer bestimmten Version entsprechen. Ihre Anforderungen mögen nicht so komplex sein, aber wenn sie es sind, hilft es sicherlich.

MikeM
quelle
Ich brauche das für ein json Objekt wie col name height = {'unit': 'cms', 'value': 150}
Rahul Dapke
3

Ich denke, Sie müssen das gesamte Feld auf Postgres 9.3 aktualisieren, zumindest ist dies das, was mir die Dokumentation sagt.

Das Aktualisieren einzelner Elemente in einem JSON-Dokument erfolgt in 9.4, wenn ich mich nicht irre.

frlan
quelle
2

Versuche dies

UPDATE Tablename
SET columnname = replace(columnname::TEXT,'"name":','"my-other-name"')::jsonb 
WHERE id = 1;
Er.Chetan wagh
quelle
Ich brauche dies für json-Objekt wie col name height = {'unit': 'cms', 'value': 150}
Rahul Dapke