向JSONB中的嵌套JSON数组添加新字段
我在PostgreSQL表中存储了一个嵌套的JSON结构 表向JSONB中的嵌套JSON数组添加新字段,json,postgresql,Json,Postgresql,我在PostgreSQL表中存储了一个嵌套的JSON结构 表用户: id |内容[JSON] JSON: 我想向costs数组中的所有对象添加一个字段“jsonClass”:“Static”,因此我最后有以下内容: { "purchases": [ { "id": 1, "costs": [ { "jsonClass": "Static", "amount": 23 },
用户
:
id |内容[JSON]
JSON:
我想向costs
数组中的所有对象添加一个字段“jsonClass”:“Static”
,因此我最后有以下内容:
{
"purchases": [
{
"id": 1,
"costs": [
{
"jsonClass": "Static",
"amount": 23
},
{
"jsonClass": "Static",
"amount": 34
}
]
},
{
"id": 2,
"costs": [
{
"jsonClass": "Static",
"amount": 42
}
]
}
]
}
我不知道如何向这种嵌套结构添加值。有人知道如何做到这一点吗?我找到的唯一方法是将它变成文本并进行字符串替换,这不是很有效,我有很多这样的条目。不幸的是,由于必须更改多个子对象,我不知道还有比解构然后重建对象更好的方法。它变得毛茸茸的
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
);
编辑:很抱歉所有的编辑,忘记测试多行。现在应该好了。也许可以简化一点,但不确定。Ca您可以展示您的代码吗?使用正确的规范化数据模型,这将非常容易@悉达多拉马尼哪种代码?我的字符串替换?@a_horse_和_no_name是的,我知道,但给定的数据没有标准化。它是一个用作文档存储的PSQL DB:/它的工作非常出色,但在一个查询中应用这些更改仍然需要太多时间。我会分块做。不幸的是,JSON操作并不快。我不认为我可以写得更快(尽管它可能更紧凑)。我指的是上面没有名字的@a_horse_:P
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
);