Cập nhật một phần tử json trong kiểu dữ liệu json


14

Tôi không thể tìm hiểu làm thế nào tôi có thể cập nhật một phần tử trong kiểu dữ liệu PostgreSQL 9.3.

Ví dụ của tôi:

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;

Phần json trong "hồ sơ"

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

Tôi đang sử dụng x-edit cho frontend và tôi đã hy vọng rằng một cái gì đó như thế này sẽ hoạt động, nhưng nó không:

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

Tôi dường như không thể tìm thấy bất kỳ thông tin nào về cách cập nhật kiểu dữ liệu json.

Câu trả lời:


7

Vì nó chỉ là một chuỗi, bạn có thể thực hiện một thay đổi / xóa đơn giản của một nút với regex_replacehàm.

Ví dụ, đây là cách gần đây tôi đã xóa một nút JSON nhất định trong một bảng (tất cả các hàng):

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

Lưu ý, đối với tất cả dữ liệu JSON của tôi, tôi giữ một "version":"(n).(n)"nút (tức là phiên bản lược đồ) trong đối tượng. Bằng cách đó tôi có thể cập nhật các đối tượng tuân thủ một phiên bản cụ thể. Yêu cầu của bạn có thể không phức tạp, nhưng nếu có, chắc chắn nó sẽ giúp ích.


Tôi cần điều này cho đối tượng json như col name height = {'unit': 'cms', 'value': 150}
Rahul Dapke

3

Tôi nghĩ bạn sẽ phải Cập nhật trường hoàn chỉnh trên Postgres 9.3, ít nhất đây là những gì tài liệu đang nói với tôi.

Cập nhật các thành phần riêng lẻ trong tài liệu JSON sẽ ở mức 9,4 nếu tôi không nhầm.


2

Thử đi

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

Tôi cần điều này cho đối tượng json như col name height = {'unit': 'cms', 'value': 150}
Rahul Dapke
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.