从 PostgreSQL 中具有未知键的多个嵌套 jsonb 对象中删除键

Remove key from multiple nested jsonb objects with unknown keys in PostgreSQL

我有一个 table,其中有一列看起来相似的 jsonb 对象,但每一行都有不同的顶级键。每条记录看起来像这样,但具有不同的顶级键:

{
   "10": {
      "key": "value",
      "toDelete": "value"
   },
   "42": {
      "key": "value",
      "toDelete": "value"
   },...
}

我需要进行更新以从每一行的每条记录中的每个对象中删除 toDelete key/value。使用 #- 运算符手动删除每个键非常容易,但每条记录中可能有数百甚至数千个顶级键,因此我需要某种动态解决方案。我尝试将所有要删除的路径聚合到一个数组中,并使用 column #- array 一次删除所有路径,其中数组看起来像 {{10, toDelete},{42,toDelete}...} 但这没有成功。

json列的结构是一个反模式,我完全同意@mvp的评论:

... you should consider extracting your data from json and store it in real SQL table(s) instead.

如果您被迫使用原始数据,请使用函数:

create or replace function remove_nested_object(obj jsonb, key_to_remove text)
returns jsonb language sql immutable as $$
    select jsonb_object_agg(key, value- key_to_remove)
    from jsonb_each(obj)
$$;

update my_table
set json_column = remove_nested_object(json_column, 'toDelete')
where json_column::text like '%"toDelete":%';