Mettre à jour un élément json dans le type de données json

14

Je n'arrive pas à comprendre comment mettre à jour un élément dans un type de données PostgreSQL 9.3.

Mon exemple:

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 partie json dans les "profils"

{
    "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"
    }
}

J'utilise x-edit pour le frontend, et j'espérais que quelque chose comme ça fonctionnerait, mais cela ne fonctionne pas:

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

Je n'arrive pas à trouver d'informations sur la mise à jour d'un type de données json.

Sébastien Deschamps
la source

Réponses:

7

Puisqu'il ne s'agit que d'une chaîne, vous pourrez peut-être effectuer une simple modification / suppression d'un nœud avec la regex_replacefonction.

Par exemple, voici comment j'ai récemment supprimé un certain nœud JSON dans une table (toutes les lignes):

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

Notez que pour toutes mes données JSON, je garde un "version":"(n).(n)"nœud (c'est-à-dire la version du schéma) dans l'objet. De cette façon, je peux mettre à jour des objets conformes à une version spécifique. Vos besoins ne sont peut-être pas si complexes, mais s'ils le sont, cela aide certainement.

MikeM
la source
J'ai besoin de cela pour un objet json comme col name height = {'unit': 'cms', 'value': 150}
Rahul Dapke
3

Je pense que vous devrez mettre à jour le champ complet sur Postgres 9.3, du moins c'est ce que la documentation me dit.

La mise à jour des éléments individuels dans un document JSON se fera en 9.4 si je ne me trompe pas.

frlan
la source
2

Essaye ça

UPDATE Tablename
SET columnname = replace(columnname::TEXT,'"name":','"my-other-name"')::jsonb 
WHERE id = 1;
Er.Chetan wagh
la source
J'en ai besoin pour un objet json comme col name height = {'unit': 'cms', 'value': 150}
Rahul Dapke