在Cosmos DB中查询嵌套子树

时间:2018-11-19 15:21:24

标签: c# azure-cosmosdb document-database

假设我在Cosmos文档中有一个父子孙子等关系,由以下JSON表示:

"id": "someUniqueString",
"peepsNkids": [
    "Jane": [
        "Joe": [],
        "Jocelyn": [
            "Jerry": [],
            "Jan": [
                "Tom": [],
                "Dick": [],
                "Harry": []
            ],
            "Jim": []
        ],
    "Mary": [
        "Moe": [],
        "Larry": [],
        "Dorothy": [
            "Eadie": [],
            "Phil": [],
            "Lucille": [
                "Desi Jr": []
            ]
        ]
    ]
]

如何使用this post titled "Query DocumentDB"的“子文档”部分的语法干净地(在Storage Explorer和C#中)查询一个子树,该子树将解析为:

SELECT * FROM peepsNkids.Jane.Jocelyn.Jan

...期望返回以下内容?

[
    "Tom": [],
    "Dick": [],
    "Harry": []
]

我认为我不必担心这里的原始ID。最糟糕的情况是,我取回了多个具有Jane.Jocelyn.Jan的记录,并且由于在我的“真实”设置中,“名称”都是唯一的ID,因此取回多行将指示严重的原理图问题。

我显然可以使用string nameList<PersonAndKids> peepsNkids创建一个潜在的周期性对象模型,然后获取ID为"someUniqueString" full 条目然后遍历带有许多peepsNkids.TryGetValue("Jane", out firstParent)种类的对象的对象,但是我正在寻找一种在Cosmos中而不是在服务的内存中实现该目的的方法。

1 个答案:

答案 0 :(得分:0)

嵌套查询不起作用

您的错误似乎是相信您必须像在问题中提到的那样查询某种“嵌套表” ...

SELECT * FROM c.peepsNkids.Jane.Jocelyn.Jan

现在您是对的,这正是 the link you provided中作为嵌套查询演示的内容,其中包括以下查询:

SELECT * 
FROM Families.address.state

我看不到在Storage Explorer中执行该方法的方法。找出如何使用此构造或是否有可能会很有趣。

等效字段

但是,可以进行等效查询来选择一种等同于表的“复合字段”。试试这个:

SELECT peepsNkids.Jane.Jocelyn.Jan FROM c

或者更好的是,要通过id将查询限制为特定文档,请尝试以下操作:

SELECT peepsNkids.Jane.Jocelyn.Jan FROM c WHERE c.id = 'someUniqueString'