2016-07-28 2 views
1

У меня есть массив объектов, который выглядит, как это в столбце таблицы jsonb value:Найти положение объекта в Postgres jsonb массива

"west": [ 
    {"id": "aa92f346-7a93-4443-949b-4eab0badd983", "version": 1}, 
    {"id": "cd92e346-6b04-3456-050a-5eeb0bddd027", "version": 3} 
] 

Я прицеливание, чтобы удалить некоторые объекты из этого массива на основе их идентификатор и версия так:

SELECT value::jsonb #- '{west, 1}' FROM game.settings; 

Однако 1 не должны быть жестко закодированы, а скорее должно равняться положение объекта в массиве, который соответствует идентификатор и версию я ищу (в этот случай "id": "cd92e346-6b04-3456-050a-5eeb0bddd027", "version": 3).

Как я могу определить это положение массива и передать его в пятно, которое в настоящее время хранится в моем жестком закодированном 1?

ответ

3

Пример данных:

create temp table settings as 
select 
    '{"west": [ 
     {"id": "aa92f346-7a93-4443-949b-4eab0badd983", "version": 1}, 
     {"id": "cd92e346-6b04-3456-050a-5eeb0bddd027", "version": 3} 
    ]}'::jsonb as value; 

Вы можете использовать jsonb_array_elements() with ordinality для определения позиции массива данного элемента:

select elem, position 
from settings, jsonb_array_elements(value->'west') with ordinality arr(elem, position) 
where elem->>'id' = 'cd92e346-6b04-3456-050a-5eeb0bddd027'; 

          elem        | position 
--------------------------------------------------------------+---------- 
{"id": "cd92e346-6b04-3456-050a-5eeb0bddd027", "version": 3} |  2 
(1 row) 

Использование position, чтобы удалить объект из массива:

select value #- array['west', (position- 1)::text] new_value 
from settings, jsonb_array_elements(value->'west') with ordinality arr(elem, position) 
where elem->>'id' = 'cd92e346-6b04-3456-050a-5eeb0bddd027'; 

           new_value         
-------------------------------------------------------------------------- 
{"west": [{"id": "aa92f346-7a93-4443-949b-4eab0badd983", "version": 1}]} 
(1 row) 
+0

Спасибо, я ищу индекс этого объекта в массиве. – MattDionis

+0

Мне пришлось прочитать вопрос невнимательно, извините. Надеюсь, отредактированный ответ отражает реальную проблему сейчас. – klin

Смежные вопросы