Postgresql
如何更新 jsonb 的 PostgreSQL 數組
我有這樣的結構(json漂亮):
[{ "uid": "comment_1", "message": "level 1 - comment 1", "comments": [{ "uid": "subcomment_1", "message": "level 2 - comment 1", "comments": [] }, { "uid": "subcomment_2", "message": "level 1 - comment 2", "comments": [] }] }, { "uid": "P7D1hbRq4", "message": "level 1 - comment 2", "comments": [] } ]
它是名為“t1”的表的一部分,其結構:
id: integer, ... other stuff..., comments: array of jsonb
我需要更新一個特定的欄位:評論
$$ 1 $$(使用 uid = comment_1)-> 評論$$ 2 $$(使用 uid = subcomment_2)-> 消息 = ‘評論已編輯’。 我是 postgresql 的新手,所以我無法弄清楚如何做到這一點,甚至沒有關閉。我設法合併對象並更改
message
為 1 級UPDATE tasks set comments[1] = comments[1]::jsonb || $$ { "message": "something", }$$::jsonb where id = 20;
但這是我能做到的。
對正確方向的任何提示?
您可以使用 jsonb_set 替換 jsonb 結構的深層部分。
...jsonb_set(thing,'{0,comments,1,message}','"something"');
將它與設置 PostgreSQL 數組的特定元素放在一起,它將是:
update tasks set comments[1]=jsonb_set(comments[1],'{0,comments,1,message}','"something"') where id=1;
弄清楚“0”和“1”是路徑中需要使用的下標,如果你還不知道的話,那就是另一回事了。
您可以使用 jsonpath (在版本 12 中是新的)基於條件提取 JSON 數組的元素(而不僅僅是基於數組索引),但我看不到更新提取值的方法,也沒有得到它會向您返回找到該值的路徑,以便您可以將路徑子放入 jsonb_set。