Удалить ключ из нескольких вложенных объектов jsonb с неизвестными ключами в PostgreSQL - PullRequest
1 голос
/ 06 марта 2019

У меня есть таблица со столбцом объектов jsonb, которые выглядят одинаково, но имеют разные ключи верхнего уровня в каждой строке.Каждая запись выглядит примерно так, но с разными ключами верхнего уровня:

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

Мне нужно обновить, чтобы удалить ключ / значение toDelete из каждого объекта в каждой записи в каждой строке.Достаточно легко удалить каждый из них вручную с помощью оператора #-, но в каждой записи могут быть сотни или даже тысячи ключей верхнего уровня, поэтому мне нужно какое-то динамическое решение.Я попытался объединить все пути для удаления в массив и удалить их все сразу, используя column #- array, где массив выглядит как {{10, toDelete},{42,toDelete}...}, но это не сработало.

1 Ответ

1 голос
/ 07 марта 2019

Структура столбца json является анти-паттерном, я полностью согласен с комментарием @mvp:

... вам следует рассмотреть возможность извлечения ваших данных из json и хранения их в реальных таблицах SQL.

Если вы вынуждены играть с исходными данными, используйте функцию:

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":%';
...