重建JSONB嵌套数组

时间:2018-02-17 18:27:49

标签: postgresql jsonb

我有以下名为value的JSONB列。

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

所以我试图从这个嵌套数组中删除项目并重新构建它

select jsonb_set(value,'{favorites}',jsonb_set('{}','{listings}', 
       jsonb_agg(new_elems))   ) as ne  from settings s ,
lateral ( select  jsonb_array_elements(elem->'listings')as new_elems 
       from jsonb_array_elements(value->'favorites')elem) sets where  
       sets.new_elems->>'id' != 'aa92f346-7a93-4443-949b-4eab0badd983' 
       group by s.value

哪个有效,但"收藏夹"阵列被夷为平地。

而不是

"{"favorites": [{"listings": [{"id": "cd92e346-6b04-3456-050a-5eeb0bddd027", "version": 3}, {"id": "cd92e346-6b04-3456-050a-5eeb0bddd333", "version": 2}]}]}"

我得到了

"{"favorites": {"listings": [{"id": "cd92e346-6b04-3456-050a-5eeb0bddd027", "version": 3}, {"id": "cd92e346-6b04-3456-050a-5eeb0bddd333", "version": 2}]}}"

有没有人知道如何解决这个问题?。

1 个答案:

答案 0 :(得分:1)

您可以使用函数JSONB_AGGJSON_BUILD_ARRAY创建jsonb数组。 JSONB_AGG是一个聚合函数,而JSONB_BUILD_ARRAY将所有提供的参数放在一个数组中。

下面,我使用JSONB_BUILD_ARRAYfavorites转换为json数组而不是键值

SELECT 
  JSONB_SET(
    '{}', '{favorites}', 
    JSONB_BUILD_ARRAY(
      JSONB_SET('{}', '{listings}', JSONB_AGG(listings))
    )
  )
FROM settings,
LATERAL (SELECT 
           JSONB_ARRAY_ELEMENTS(JSONB_ARRAY_ELEMENTS(value->'favorites')->'listings') listings
         FROM settings) listings
WHERE listings.listings->>'id' != 'aa92f346-7a93-4443-949b-4eab0badd983'