【问题标题】:How to query nested array with Cosmos DB如何使用 Cosmos DB 查询嵌套数组
【发布时间】:2019-11-20 11:04:12
【问题描述】:

鉴于以下 JSON

{
"Families": [
    { "Name": "Smith",
      "Children": [
        { "Name": "Bob",
            "Pets": [
              { "Name": "Oscar", "Type": "Cat"},
              { "Name": "Otto", "Type": "Dog"}
            ]
        },
        { "Name": "Brittney",
            "Pets": [
              { "Name": "Isolde", "Type": "Dog"},
              { "Name": "Ignatz", "Type": "Turtle"}
            ]
        }
    ]
    },
    { "Name": "Miller",
      "Children": [
        { "Name": "Alex",
            "Pets": [
              { "Name": "Elvis", "Type": "Horse"}
            ]
        }
    ]
    }
]
}

A) 我想创建一个产生以下结构的查询

[
    { "FamilyName": "Smith",
    "KidName": "Bob",
    "Petname": "Oscar"
    },
    { "FamilyName": "Smith",
    "KidName": "Bob",
    "Petname": "Otto"
    },
    { "FamilyName": "Smith",
    "KidName": "Brittney",
    "Petname": "Isolde"
    },
    { "FamilyName": "Smith",
    "KidName": "Brittney",
    "Petname": "Ignatz"
    },
    { "FamilyName": "Miller",
    "KidName": "Alex",
    "Petname": "Elvis"
    }
]

B) 我想创建一个产生这种稍微不同的结构的查询

[
    { "FamilyName": "Smith",
    "KidName": "Bob",
    "Petnames": ["Oscar", Otto"]
    },
    { "FamilyName": "Smith",
    "KidName": "Brittney",
    "Petname": ["Isolde", "Ignatz"]
    },
    { "FamilyName": "Miller",
    "KidName": "Alex",
    "Petname": ["Elvis"]
    }
]

非常感谢您的帮助

罗伯特

【问题讨论】:

    标签: azure-cosmosdb


    【解决方案1】:

    这里实际上有一个非常好的文档:https://docs.microsoft.com/en-us/azure/cosmos-db/sql-query-join 和这里:https://docs.microsoft.com/en-us/azure/cosmos-db/sql-query-object-array#arrays

    对于数组,您希望使用嵌套连接,如下所示:

    给定:

    {
        "id": "so-test",
        "Families": [
            {
                "Name": "Smith",
                "Children": [
                    {
                        "Name": "Bob",
                        "Pets": [
                            {
                                "Name": "Oscar",
                                "Type": "Cat"
                            },
                            {
                                "Name": "Otto",
                                "Type": "Dog"
                            }
                        ]
                    },
                    {
                        "Name": "Brittney",
                        "Pets": [
                            {
                                "Name": "Isolde",
                                "Type": "Dog"
                            },
                            {
                                "Name": "Ignatz",
                                "Type": "Turtle"
                            }
                        ]
                    }
                ]
            },
            {
                "Name": "Miller",
                "Children": [
                    {
                        "Name": "Alex",
                        "Pets": [
                            {
                                "Name": "Elvis",
                                "Type": "Horse"
                            }
                        ]
                    }
                ]
            }
        ]
    }
    

    您可以将此查询用于 A:

    SELECT 
        f.Name as FamilyName,
        c.Name as KidName,
        p.Name as Petname
    FROM d
    JOIN f IN d.Families
    JOIN c IN f.Children
    JOIN p IN c.Pets
    WHERE d.id = "so-test"
    

    你会得到这个结果:

    [
        {
            "FamilyName": "Smith",
            "KidName": "Bob",
            "Petname": "Oscar"
        },
        {
            "FamilyName": "Smith",
            "KidName": "Bob",
            "Petname": "Otto"
        },
        {
            "FamilyName": "Smith",
            "KidName": "Brittney",
            "Petname": "Isolde"
        },
        {
            "FamilyName": "Smith",
            "KidName": "Brittney",
            "Petname": "Ignatz"
        },
        {
            "FamilyName": "Miller",
            "KidName": "Alex",
            "Petname": "Elvis"
        }
    ]
    

    对于 B),使用添加了 ARRAY 方法的查询

    SELECT 
        f.Name as FamilyName,
        c.Name as KidName,
        ARRAY(SELECT DISTINCT VALUE p.Name from p IN c.Pets) as Petname
    FROM d
    JOIN f IN d.Families
    JOIN c IN f.Children
    WHERE d.id = "so-test"
    

    你会得到这些结果:

    [
        {
            "FamilyName": "Smith",
            "KidName": "Bob",
            "Petname": [
                "Oscar",
                "Otto"
            ]
        },
        {
            "FamilyName": "Smith",
            "KidName": "Brittney",
            "Petname": [
                "Isolde",
                "Ignatz"
            ]
        },
        {
            "FamilyName": "Miller",
            "KidName": "Alex",
            "Petname": [
                "Elvis"
            ]
        }
    ]
    

    【讨论】:

      猜你喜欢
      • 2021-05-22
      • 2019-01-25
      • 2021-12-14
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 2018-10-04
      • 1970-01-01
      相关资源
      最近更新 更多