PostgreSQL: удалить пару ключ / значение из массива с объектами json
У меня есть таблица:
CREATE TABLE movies( id text, data jsonb );
INSERT INTO movies(id, data) VALUES (
'1',
{
"actors": [
{
"name": "actor1",
"email": "actor1@somemail.com"
},
{
"name": "actor2",
"email": "actor2@somemail.com"
}
]
}
);
Я хочу удалить поле электронной почты (ключ + значение) из каждого объекта json массива акторов.
Я пробовал следующее решение, и хотя оно выполняется, оно вообще не влияет на массив:
update movies
set data = jsonb_set(data, '{actors}', (data->'actors') - '{actors, email}')
where id = '1';
2 ответа
Решение
Чтобы управлять всеми элементами в массиве, вам нужно будет использовать подзапрос:
UPDATE movies
SET data = jsonb_set(data, '{actors}', (
SELECT jsonb_agg(actor - 'email')
FROM jsonb_array_elements(data->'actors') actor
))
WHERE id = '1';
Вам нужно указать индексы индивидуально, чтобы удалить элемент массива email
update movies
set data = jsonb_set(data, '{actors}', data -> 'actors' #- '{0,email}' #- '{1,email}')
where id = '1';
элемент пути {1,email}
может быть заменен на {-1,email}
(Отрицательные целые числа считаются с конца).