Python Sqlalchemy筛选器在数组中嵌套jsonb
我有一个PostgresJSONB字段,其中包含一些嵌套数组和其他对象Python Sqlalchemy筛选器在数组中嵌套jsonb,python,postgresql,sqlalchemy,jsonb,Python,Postgresql,Sqlalchemy,Jsonb,我有一个PostgresJSONB字段,其中包含一些嵌套数组和其他对象 来自sqlalchemy.dialogs.postgresql导入JSONB 类族(db.Model): meta=db.Column(JSONB) joes=家庭(元)=[ { “姓名”:“乔”, “儿童”:[ { “姓名”:“简” }, { “姓名”:“凯特” } ] }, { “姓名”:“丽莎”, “儿童”:[ { “姓名”:“玛丽” }, { “姓名”:“大卫” } ] }, ]) 有没有办法查询所有名字中有某个子
来自sqlalchemy.dialogs.postgresql导入JSONB
类族(db.Model):
meta=db.Column(JSONB)
joes=家庭(元)=[
{
“姓名”:“乔”,
“儿童”:[
{
“姓名”:“简”
},
{
“姓名”:“凯特”
}
]
},
{
“姓名”:“丽莎”,
“儿童”:[
{
“姓名”:“玛丽”
},
{
“姓名”:“大卫”
}
]
},
])
有没有办法查询所有名字中有某个子字符串的孩子
如果我想查询'a'
它应该会得到玛丽、大卫、凯特、简
我在想,也许
Family.query.filter(
Family.meta.contains([{“children”:[{“name”:func.contains(“a”)}]}])
)
诀窍是使用以下命令取消对一个或多个数组的测试,然后进行筛选:
meta_value = literal_column('meta.value', type_=JSONB)
children_value = literal_column('children.value', type_=JSONB)
Family.query.\
with_entities(children_value['name'].astext).\
select_from(
Family,
func.jsonb_array_elements(Family.meta).alias('meta'),
func.jsonb_array_elements(
meta_value['children']).alias('children')).\
filter(children_value['name'].astext.contains('a'))
请注意使用来引用集合返回函数的值
另一个选项是使用jsonb\u path\u query()
(在第12版中介绍):
例如,有调整,但如果您提供模型、您尝试过的内容等,则有助于提供答案。谢谢!我查看了它,但不确定它如何适应多个嵌套数组对象。我添加了一个虚拟模型,但我不认为它取决于模型的结构。
name = column('name', type_=JSONB)
Family.query.\
with_entities(name.astext).\
select_from(
func.jsonb_path_query(
Family.meta,
'$[*].children[*].name').alias('name')).\
filter(name.astext.contains('a')).\
all()