簡體   English   中英

Sqlalchemy 過濾器嵌套在數組中的 jsonb

[英]Sqlalchemy filter nested jsonb within arrays

我有一個 Postgres JSONB 字段,其中包含一些嵌套數組和其他對象。

from sqlalchemy.dialects.postgresql import JSONB


class Family(db.Model):
   meta = db.Column(JSONB)


joes = Family(meta=[
    {
        "name": "Joe",
        "children": [
            {
                "name": "Jane"
            },
            {
                "name": "Kate"
            }
        ]
    },
    {
        "name": "Lisa",
        "children": [
            {
                "name": "Mary"
            },
            {
                "name": "David"
            }
        ]
    },
])

有沒有辦法查詢所有名字中帶有某個子字符串的孩子?

如果我想查詢'a'它應該讓我Mary, David, Kate, Jane

我在想,也許像

Family.query.filter(
    Family.meta.contains([{"children": [{"name": func.contains("a")}]}])
)

訣竅是使用jsonb_array_elements()或多個數組,然后過濾:

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'))

注意使用literal_column()來引用集合返回函數jsonb_array_elements()

另一種選擇是使用jsonb_path_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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM