[英]Delete element in a deeply nested array in jsonb column - Postgres
[英]Updating a nested array element in a jsonb column with postgres 12.10
我正在尝试更新数组中的记录。 表是participant
,列是activities
,形状为:
{
enrolled: [{
sport: {
id: 1,
name: 'soccer'
}
}, {
sport: {
id: 2,
name: 'hockey'
}
}]
}
我想运行一个查询,说,
如果活动[*].enrolled.sport == 1,则为注册日添加一些 JSON blob
registered: {
day: 12,
month: 'Aug'
}
生成的 object 将是:
{
enrolled: [{
sport: {
id: 1,
name: 'soccer'
},
registered: {
day: 12
month: 'Aug'
}
}, {
sport: {
id: 2,
name: 'hockey'
}
}]
}
我尝试了以下方法,但它用添加的 object 替换了整个列:(
set activities = (
select jsonb_agg(jsonb_set(sports, '{registered}', '{"day": 12, "month": "Aug"}', true))
from jsonb_array_elements(activities::jsonb -> 'enrolled') sports
)
where activities::jsonb -> 'enrolled' @? '$.sport.id ? (@ == 1)';
恐怕你必须重建整个activities
object。
无关,但我认为这是一个糟糕的数据设计。 您的示例远非有效的 JSON。
update participant set activities =
(
select jsonb_build_object
(
'enrolled',
(jsonb_agg(case when j->'sport'->>'id' = '1' then j||YOUR_JSONB_BLOB else j end))
)
from jsonb_array_elements(activities->'enrolled') j
)
where activities @> '{"enrolled":[{"sport":{"id":1}}]}';
这是您的示例的插图
select jsonb_build_object
(
'enrolled',
(jsonb_agg(case when j->'sport'->>'id' = '1' then j||'{"registered":{"day":12,"month":"Aug"}}' else j end))
)
from jsonb_array_elements('
{
"enrolled":
[
{ "sport": { "id": 1, "name": "soccer"}},
{ "sport": { "id": 2, "name": "hockey"}}
]
}'::jsonb->'enrolled') j;
结果:
{
"enrolled": [
{
"sport": {
"id": 1,
"name": "soccer"
},
"registered": {
"day": 12,
"month": "Aug"
}
},
{
"sport": {
"id": 2,
"name": "hockey"
}
}
]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.