我如何更新json数组对象值

时间:2019-04-18 07:02:33

标签: postgresql

我有一个数组对象,它不是更新的对象值。 它总是在数组中附加一个新对象。

我尝试过||运算符,但它仅适用于对象,而不适用于数组对象。 我执行以下操作:

UPDATE "chats" SET

                    "groupUserStatus"="groupUserStatus" :: JSONB || '{"1":"viewed"}'

                    WHERE  "chats"."chatType"='groupchat' AND

                    ("chats"."groupUserStatus") :: JSONB @> '{"1":"sent"}' :: JSONB

它已成功更新对象,但我有更新数组对象。 例如 像这样插入记录

[{"1":"sent"},{"2":"read"}]

但是我将如何获得这样的记录(如何更新记录)

[{"1":"viewed"},{"2":"read"}]

对不起,英语不好

1 个答案:

答案 0 :(得分:0)

使用jsonb_set

 set groupUserStatus = jsonb_set ( groupUserStatus :: JSONB ,'{0,"1"}', '"viewed"')

DEMO

编辑:要动态获取索引并进行更新,您可能需要 提取数组的元素和每个键值对。

update t t1 set col = jsonb_set ( t2.col :: JSONB ,
           ('{'||j.idx-1||',"'||e.k||'"}')::text[] , '"viewed"' )
           FROM  t t2 cross join 
   jsonb_array_elements  (t2.col :: JSONB) with ordinality as j(elem,idx)
cross join jsonb_each_text(j.elem) as e(k,v)
where e.v ='sent'
and t1.id = t2.id

DEMO2