如何使用密钥更新 json 数组



假设我的jsonb列中有这个json。

{
"fields": [
{
"name": "firstName",
"age": 17
},
{
"name": "lastName",
"age": 25
},
...
}

如何在不使用索引的情况下仅更新"名字"?

到目前为止我有这个,但这是使用我不想使用的索引

UPDATE person
SET 
field = jsonb_set(field, 
concat('{fields, 0, name'}')::text[], 
'new value'::jsonb, 
TRUE)

您需要取消嵌套数组元素,替换所需的数组元素,然后将它们聚合回来:

update the_table tg
set data = data||(select jsonb_build_object(
'fields', jsonb_agg(case
when t.j ->> 'name' = 'firstName' 
then t.j||'{"name": "new_name"}'
else t.j
end))
from jsonb_array_elements(tg.data -> 'fields') as t(j))
where ....;

在线示例:https://rextester.com/BZVKD68215

最新更新