我有一张桌子mapping_transform
带有 JSONB 列content_json
包含类似的东西
{
"meta": {...},
"mapping": [
...,
{
"src": "up",
"dest": "down",
...
},
...
]
}
我想添加一个新的 JSON 条目("rule_names": [ "some name" ]
) 到 JSON 对象匹配src
= up
and dest
= down
,这会导致
{
"meta": {...},
"mapping": [
...,
{
"src": "up",
"dest": "down",
...,
"rule_names": [ "some name" ]
},
...
]
}
以下查询返回JSON 对象满足过滤要求:
WITH elems AS (SELECT json_array_elements(content_json->'mapping') from mapping_transform)
SELECT * FROM elems WHERE json_array_elements->>'src' = 'up' and json_array_elements->>'dest' = 'down';
-- Alternative
SELECT mt_entry
FROM mapping_transform,
LATERAL jsonb_array_elements(content_json::jsonb->'mapping') mt_entry
WHERE mt_entry->>'src' = 'up' and mt_entry->>'dest' = 'down';
我现在的问题是我不知道如何将新条目添加到特定对象。我尝试过类似的东西
WITH elems AS (SELECT json_array_elements(content_json->'mapping') from mapping_transform),
results SELECT * FROM elems WHERE json_array_elements->>'src' = 'up' and json_array_elements->>'dest' = 'down'
UPDATE mapping_transform
SET content_json = jsonb_set(results, '{"rule_names"}', '["some name"]'); -- this does obviously not work
但这并不执行为results
是未知列。我还需要合并结果jsonb_set
与其余的content_json
在分配给之前content_json
,因为否则它将覆盖整个内容。
如何根据过滤条件更新特定的深层嵌套 JSON 对象?
如果我有一个明确定义的路径来确定我想要更新的对象的位置,那么事情就会容易得多。但由于目标对象位于 JSON 数组中并且具有任意位置,查找和更新它要困难得多。