我有一个JSONB字段,它有时有嵌套的键。示例:
{"nested_field": {"another URL": "foo", "a simple text": "text"},
"first_metadata": "plain string",
"another_metadata": "foobar"}
如果我做了
.filter(TestMetadata.metadata_item.has_key(nested_field))
我得到了这张唱片。
如何搜索嵌套键的存在?("a simple text"
)
2条答案
按热度按时间0mkxixxg1#
对于SQLAlchemy,以下内容应该适用于您的测试字符串:
根据
JSONB
的SQLAlchemy文档(搜索 Path index operations 示例):它应该生成下面的
SQL
:a11xaf1n2#
更新Postgres 12+
使用
jsonpath
运算符**@?
**:如果(且仅当)
jsonb
值具有嵌套键,则返回true
。可以通过jsonb列
(metadata_item)
上的普通GIN索引或更专门的jsonb_path_ops
索引来支持。参见:老版本原始答案
此查询在使用
->
operator提取嵌套JSON对象后,使用**?
**运算符测试嵌套字段是否存在:请注意,普通GIN索引不支持此查询。您需要在
metadata_item->'nested_field'
上使用expression index来加快速度。手册中有一个类似案例的例子。