[英]SQLAlchemy filter according to nested keys in JSONB
我有一個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"
)
使用SQLAlchemy,以下內容適用於您的測試字符串:
class TestMetadata(Base):
id = Column(Integer, primary_key=True)
name = Column(String)
metadata_item = Column(JSONB)
根據JSONB
SQLAlchemy文檔 (搜索Path索引操作示例):
expr = TestMetadata.metadata_item[("nested_field", "a simple text")]
q = (session.query(TestMetadata.id, expr.label("deep_value"))
.filter(expr != None)
.all())
哪個應生成以下SQL
:
SELECT testmetadata.id AS testmetadata_id,
testmetadata.metadata_item #> %(metadata_item_1)s AS deep_value
FROM testmetadata
WHERE (testmetadata.metadata_item #> %(metadata_item_1)s) IS NOT NULL
-- @params: {'metadata_item_1': u'{nested_field, a simple text}'}
此查詢測試是否存在嵌套字段?
運算符 ,在使用->
運算符提取嵌套的JSON對象之后:
SELECT EXISTS (
SELECT 1
FROM testmetadata
WHERE metadata_item->'nested_field' ? 'a simple text'
);
請注意,普通GIN索引不支持此查詢。 您需要在metadata_item->'nested_field'
上使用表達式索引才能使其快速。
CREATE INDEX testmetadata_special_idx ON testmetadata
USING gin ((metadata_item->'nested_field'));
手冊中有一個類似案例的例子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.