Postgresql

如何更新 jsonb 的 PostgreSQL 數組

  • November 30, 2020

我有這樣的結構(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。

引用自:https://dba.stackexchange.com/questions/246666