Как удалить объект в jsonb, имеющий определенное значение - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть тип jsonb со следующими примерами данных:

[
  {
    "name": "test1_name",
    "lastname": "test1_lastname"
  },
  {
    "name": "test2_name",
    "lastname": "test2_lastname",
    "order": 14
  }
]

Теперь я пытаюсь найти способ удалить все документы внутри массива, где поле заказа НЕ ПУСТО (NULL).Я действительно понятия не имею, как это сделать.В общем, на словах я хочу это:

"delete all objects inside the arrays
where order-value is not null"

Я действительно не знаю, как начать с этого;так как я не знаю индекс массива документа, я в конечном итоге хочу удалить.Есть предложения?

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Если я правильно понимаю ваш вопрос - и, сделав дополнительное предположение, у вас есть таблица, которая представляет собой не просто один столбец массива jsonb, а нечто, похожее на это, называемое my_table

| id (primary key) | user_list (jsonb array) |

Используя оператор with - вы можете сделать что-то вроде следующего:

WITH user_update AS (
SELECT
    id, users - (index::integer - 1) as new_list
FROM my_table,
    jsonb_array_elements(user_list) WITH ORDINALITY elems(data, index)
WHERE
    elems.data -> 'order' IS NOT NULL
)
UPDATE my_table SET user_list = user_update.new_list from user_update where my_table.id = user_update.id;
0 голосов
/ 19 сентября 2019

demo: db <> fiddle

SELECT
    jsonb_agg(elems.data ORDER BY elems.index)
FROM mytable,
    jsonb_array_elements(mydata) WITH ORDINALITY elems(data, index)
WHERE 
    elems.data -> 'order' IS NULL
  1. Разверните массив в одну запись на элемент (используйте предложение WITH ORDINALITY, чтобы получить индексы для хранения правильныхзаказ)
  2. Отфильтруйте соответствующие данные
  3. Повторно объедините оставшиеся элементы, используя индекс.
...