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 自身结合起来吗?
第一种方式:使用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
- 每 "field" 将所有子对象展开为一行。这将创建 2 列:
key
和 value
(在您的情况下为 login
和 {"meta": {"indexable": true}, "value": "fred"}
)
- 通过使用您已经提到的
@>
检查包含 meta
对象的值列来过滤记录
- 重新创建 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
- 像您一样找到所有键
- 和3.和第一种方式很相似
我正在为我的 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 自身结合起来吗?
第一种方式:使用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
- 每 "field" 将所有子对象展开为一行。这将创建 2 列:
key
和value
(在您的情况下为login
和{"meta": {"indexable": true}, "value": "fred"}
) - 通过使用您已经提到的
@>
检查包含meta
对象的值列来过滤记录 - 重新创建 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
- 像您一样找到所有键
- 和3.和第一种方式很相似