postgres从json数组删除json对象



我使用postgres 12。X,我有以下日志表:-

logs
id bigint,jsondata文本

以下是json

中的值
[
{
"loginfo": "somelog1",
"id": "app1"
},
{
"loginfo": "somelog2",
"id": "app2"
}
]

我需要删除所有json对象从这个文本列id == "app2">

尝试了以下答案:- https://dba.stackexchange.com/questions/84472/how-to-remove-object-from-json-array

UPDATE logs i SET    jsondata = i2.jsondata FROM  (SELECT id, array_to_json(array_agg(elem)) AS jsondata
FROM   logs cand
, json_array_elements(cand.jsondata) elem
WHERE  cand.jsondata @> '{[{"id":"app2"}]}'::jsonb
AND    elem->>'id' <> 'app2'
GROUP  BY 1 ) i2
WHERE i2.id = i.id;

但是ERROR出现在下面:-

错误:函数json_array_elements(text)不存在

demo:db<>fiddle

为什么要在text列中存储JSON对象?在这种情况下,您需要在将其作为JSON使用之前对其进行强制转换:

SELECT
id,
json_agg(elems)                               -- 3
FROM mytable,
json_array_elements(jsondata::json) as elems  -- 1
WHERE elems ->> 'id' <> 'app2'                    -- 2
GROUP BY id
  1. 将文本转换为JSON;将JSON数组提取为每个元素的记录
  2. 筛选所需对象
  3. 将剩余的元素重新聚合到一个新的JSON数组