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}(Отрицательные целые числа считаются с конца).

Demo

Другие вопросы по тегам