如何使用 Cosmos DB 查询嵌套数组

rob*_*kuz 0 azure-cosmosdb

给出以下 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"}
            ]
        }
    ]
    }
]
}
Run Code Online (Sandbox Code Playgroud)

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"
    }
]
Run Code Online (Sandbox Code Playgroud)

B)我想创建一个查询来产生这个略有不同的结构

[
    { "FamilyName": "Smith",
    "KidName": "Bob",
    "Petnames": ["Oscar", Otto"]
    },
    { "FamilyName": "Smith",
    "KidName": "Brittney",
    "Petname": ["Isolde", "Ignatz"]
    },
    { "FamilyName": "Miller",
    "KidName": "Alex",
    "Petname": ["Elvis"]
    }
]
Run Code Online (Sandbox Code Playgroud)

非常感谢您的帮助

罗伯特

Chr*_*SFT 6

实际上这里有一个非常好的文档:https: //learn.microsoft.com/en-us/azure/cosmos-db/sql-query-join和这里: https: //learn.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"
                        }
                    ]
                }
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

您可以对 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"
Run Code Online (Sandbox Code Playgroud)

你会得到这个结果:

[
    {
        "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"
    }
]
Run Code Online (Sandbox Code Playgroud)

对于 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"
Run Code Online (Sandbox Code Playgroud)

你会得到这些结果:

[
    {
        "FamilyName": "Smith",
        "KidName": "Bob",
        "Petname": [
            "Oscar",
            "Otto"
        ]
    },
    {
        "FamilyName": "Smith",
        "KidName": "Brittney",
        "Petname": [
            "Isolde",
            "Ignatz"
        ]
    },
    {
        "FamilyName": "Miller",
        "KidName": "Alex",
        "Petname": [
            "Elvis"
        ]
    }
]
Run Code Online (Sandbox Code Playgroud)