Zaktualizuj element json w typie danych json

14

Nie mogę zrozumieć, jak mogę zaktualizować element w typie danych PostgreSQL 9.3.

Mój przykład:

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;

Część json w „profilach”

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

Używam x-edit dla frontendu i miałem nadzieję, że coś takiego zadziała, ale to nie działa:

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

Nie mogę znaleźć żadnych informacji o tym, jak zaktualizować typ danych Json.

Sebastien Deschamps
źródło

Odpowiedzi:

7

Ponieważ jest to tylko ciąg znaków, możesz być w stanie dokonać prostej zmiany / usunięcia węzła za pomocą regex_replacefunkcji.

Na przykład w ten sposób niedawno usunąłem określony węzeł JSON w tabeli (wszystkie wiersze):

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

Uwaga: dla wszystkich moich danych JSON trzymam "version":"(n).(n)"w obiekcie węzeł (tj. Wersję schematu). W ten sposób mogę aktualizować obiekty zgodne z określoną wersją. Twoje wymagania mogą nie być tak złożone, ale jeśli tak, to z pewnością pomaga.

MikeM
źródło
Potrzebuję tego dla obiektu json jak col name height = {'unit': 'cms', 'value': 150}
Rahul Dapke
3

Myślę, że będziesz musiał zaktualizować pełne pole na Postgres 9.3, przynajmniej tak mówi mi dokumentacja.

Aktualizacja poszczególnych elementów w dokumencie JSON nastąpi w wersji 9.4, jeśli się nie mylę.

frlan
źródło
2

Spróbuj tego

UPDATE Tablename
SET columnname = replace(columnname::TEXT,'"name":','"my-other-name"')::jsonb 
WHERE id = 1;
Er.Chetan wagh
źródło
Potrzebuję tego dla obiektu json, takiego jak nazwa
kolumny