Postgres: удалить объект из анонимного элемента массива jsonb - PullRequest
0 голосов
/ 29 августа 2018

У меня есть таблица с 2 полями:

table documents
  docu_id     uuid
  attachments jsonb

Пример данных для столбца attachments jsonb будет:

[
 {
    "size": 10,
    "attach_id": "d3a21f904068"
 },{
    "Size": 0.143,
    "attach_id": "5ba4b285565b"
 }
]

Я видел много примеров того, как обновить / удалить jsonb на основе имени поля, но можно ли удалить анонимный объект из анонимного массива , где "attach_id" = "X" and "docu_id"="Y":

delete from documents
  where docu_id = "Y" 
    and
    where attachments @> '[{"attach_id": "X"}]'

1 Ответ

0 голосов
/ 30 августа 2018

Хорошо, нашел решение, поэтому я делюсь им здесь, (ссылка на ректер http://rextester.com/YICZ86369):

Вставка данных

  create table documents(docu_id text, attachments jsonb);
    insert into documents values
    ('001', 
    '[
      {
        "name": "uno",
        "id":"1"
      },
       {
        "name": "dos",
        "id":"2"
      },
       {
        "name": "tres",
        "id":"3"
      }
    ]'
    ),
    ('002', 
    '[
      {
        "name": "eins",
        "id":"1"
      },
       {
        "name": "zwei",
        "id":"2"
      }
    ]'
    );
    select * from documents;

enter image description here

Решение

UPDATE documents
   SET attachments = attachments #- 
          array(
                    SELECT i
                      FROM generate_series(0, jsonb_array_length(attachments) - 1) AS i
                      WHERE (attachments->i->'id' = '"2"')
           )::text[] /* cast as text */
       where docu_id = '002';

select * from documents;

enter image description here

...