Postgres - 查询嵌套对象的 JSON 列值

Postgres - query JSON column value of nested object

我正在为我的 table(名为 fields)的 JSONB 列使用以下架构。这些 字段 条目中有几个。

{
   "FIELD_NAME": {
      "value" : "FIELD_VALUE",
      "meta": {
         "indexable": true
      }
   }
}

我需要找到所有包含该对象的字段

 "meta": {
    "indexable": true
 }

这是在 where 子句中使用 json_object_keys 的幼稚尝试,它不起作用,但说明了我正在尝试做的事情。

with entry(fields) as (values('{
  "login": {
    "value": "fred",
    "meta": {
      "indexable": true
    }
  },
  "password_hash": {
    "value": "88a3d1c7463d428f0c44fb22e2d9dc06732d1a4517abb57e2b8f734ce4ef2010",
    "meta": {
      "indexable": false
    }
  }
}'::jsonb))
select * from entry where fields->jsonb_object_keys(fields) @> '{"meta": {"indexable": "true"}}'::jsonb;

如何查询嵌套对象的值?我能以某种方式将 json_object_keys 的结果与 table 自身结合起来吗?

demo:db<>fiddle

第一种方式:使用jsonb_each()

SELECT
    jsonb_build_object(elem.key, elem.value)        -- 3
FROM
    entry,
    jsonb_each(fields) as elem                      -- 1
WHERE
    elem.value @> '{"meta": {"indexable": true}}'   -- 2
  1. 每 "field" 将所有子对象展开为一行。这将创建 2 列:keyvalue(在您的情况下为 login{"meta": {"indexable": true}, "value": "fred"}
  2. 通过使用您已经提到的 @> 检查包含 meta 对象的值列来过滤记录
  3. 重新创建 JSON 对象(合并 key/value 列)

第二种方式:使用jsonb_object_keys()

SELECT
    jsonb_build_object(keys, fields -> keys)            -- 3
FROM
    entry,
    jsonb_object_keys(fields) as keys                   -- 1
WHERE 
    fields -> keys @> '{"meta": {"indexable": true}}'   -- 2
  1. 像您一样找到所有键
  2. 和3.和第一种方式很相似