У меня есть таблица с именем test, которая имеет 2 столбца: (id int, md jsonb). md столбец может содержать такие данные
{
"a": {
...
"author": "alice"
...
},
"b": {
...
"author": "alice"
...
}
}
теперь я хочу обновить все экземпляры alice до bob.
Я получил идентификаторы строк, содержащих alice, выполнив
select id from test, lateral jsonb_each(md) where md->>'author' = 'alice';
Существуют ли какие-либо средства Postgres для обновления каждого внутреннего объекта, содержащего поле author?
Любые предложения приветствуются.
как использовать это для перебора каждого внутреннего объекта jsonb и обновления значений?





Я согласен с @a_horse_with_no_name, что лучше проверить свое хранилище. Но это интересно сделать в качестве упражнения. Я думаю, что единственный способ сделать это — расширить json с помощью jsonb_each, обновить данные с помощью jsonb_set, а затем агрегировать их обратно с помощью jsonb_object_agg:
update test as t set
md = (
select
jsonb_object_agg(
d.key,
case
when d.value->>'author' = 'alice' then
jsonb_set(d.value, '{author}', '"bob"')
else
d.value
end
)
from lateral jsonb_each(t.md) as d
)
where
exists (select * from jsonb_each(t.md) as d where d.value->>'author' = 'alice')
jsonb_set()? - но было бы намного проще с правильно нормализованной моделью данных