Postgresql - 没有子查询的jsonb对象减少

Posgresql - jsonb object reduce without a subquery

我有一个 jsonb 列,具有这样的用户权限(这是一条记录的值):

{
   "user_1":{
      "permissions":[
         "edit",
         "view"
      ]
   },
   "user_2":{
      "permissions":[

      ]
   },
   "user_3":{
      "permissions":[
         "view"
      ]
   }
}

我想要实现的是将这个 jsonb 对象转换成一个 jsonb 对象数组,如下所示:

[
   {
      "login":"user_1",
      "permissions":[
         "edit",
         "view"
      ]
   },
   {
      "login":"user_2",
      "permissions":[

      ]
   },
   {
      "login":"user_3",
      "permissions":[
         "view"
      ]
   }
]

只需 "move" 登录键到一个单独的字段并将其作为数组索引。

问题是:
是否可以在没有子查询的情况下在 PostgreSQL(版本 10.x)中执行此操作?

这是我的带有子查询的版本:

SELECT jsonb_agg(jsonb_build_object('login', tbl.key, 'permissions', tbl.value->'permissions')), id FROM (
    SELECT (jsonb_each(permissions_tbl.permissions_obj)).*, id
    FROM (
        SELECT '{"user_1": {"permissions": ["edit", "view"]}, "user_2": {"permissions": []}, "user_3": {"permissions": ["view"]}}'::jsonb permissions_obj, 123 id
    ) as permissions_tbl

) as tbl GROUP BY id;

我使用了 jsonb_eachjsonb_build_objectjsonb_aggid 与包含多个用户和权限的 permissions_obj 相关。非常欢迎任何改进查询的建议。

Click: step-by-step demo:db<>fiddle

SELECT
    jsonb_agg(                                  -- 4
        jsonb_build_object('login', key)        -- 2            
        || value                                -- 3
    )
FROM
    mytable,
    jsonb_each(mydata)                          -- 1
  1. 将 JSON 对象扩展为每个元素一行。这将创建两个新列:key(这是您的 login)和 value(这是您的 permissions 对象)
  2. logins
  3. 创建一个新的 JSON 对象
  4. permissions 个对象添加到新的 JSON 个对象中
  5. 将它们重新聚合成一个 JSON 数组