我在PostgreSQL表中存储了一个嵌套的JSON结构。
表users
:
id | content [JSON]
JSON:
{
"purchases": [
{
"id": 1,
"costs": [
{
"amount": 23
},
{
"amount": 34
}
]
},
{
"id": 2,
"costs": [
{
"amount": 42
}
]
}
]
}
我想向"jsonClass": "Static"
数组内的所有对象添加字段costs
,所以最后我要完成以下操作:
{
"purchases": [
{
"id": 1,
"costs": [
{
"jsonClass": "Static",
"amount": 23
},
{
"jsonClass": "Static",
"amount": 34
}
]
},
{
"id": 2,
"costs": [
{
"jsonClass": "Static",
"amount": 42
}
]
}
]
}
我不知道如何向这样的嵌套结构添加值。有人知道如何实现这种目标吗?我发现的唯一方法是将其设置为文本并执行字符串替换,这并不是很有效,并且我有很多这样的条目。
答案 0 :(得分:1)
不幸的是,由于不得不更改多个子对象,我不知道有比解构然后再重建对象更好的方法。变得很毛。
UPDATE users
SET content=(
SELECT jsonb_agg(purchase)
FROM (
SELECT jsonb_build_object('id', pid, 'purchases', jsonb_agg(cost)) AS purchase
FROM (
SELECT pid, cost || '{"jsonClass":"static"}'::jsonb AS cost
FROM (
SELECT purchase->'id' AS pid, jsonb_array_elements(purchase->'costs') AS cost
FROM jsonb_array_elements(content::jsonb->'purchases') AS purchase
) AS Q
) AS R
GROUP BY pid
) AS S
);
编辑:对不起所有编辑,忘记测试多行了。现在应该很好。不确定,也许可以进一步简化它。