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

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.

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.


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.


2

Essaye ça

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

J'en ai besoin pour un objet json comme col name height = {'unit': 'cms', 'value': 150}
Rahul Dapke
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.