在postgres jsonb数组中find对象的位置

我有一个在表的jsonb value列中看起来像这样的对象数组:

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

我打算从这个数组中删除某些对象的ID和版本,如下所示:

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

然而, 1不应该被硬编码,而是应该等于数组中匹配我所寻找的id和版本的对象的位置(在本例中为"id": "cd92e346-6b04-3456-050a-5eeb0bddd027", "version": 3 )。

我将如何去确定这个数组的位置,并将其传递到硬编码1当前拥有的位置?

示例数据:

 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)