Azure cosmosdb Azure DocumentDb中数组上的WHERE子句

Azure cosmosdb Azure DocumentDb中数组上的WHERE子句,azure-cosmosdb,nosql,Azure Cosmosdb,Nosql,在类似这样的Azure Documentdb文档中 { "id": "WakefieldFamily", "parents": [ { "familyName": "Wakefield", "givenName": "Robin" }, { "familyName": "Miller", "givenName": "Ben" } ], "children": [ { "familyName": "Merriam", "givenName"

在类似这样的Azure Documentdb文档中

{
"id": "WakefieldFamily",
"parents": [
    { "familyName": "Wakefield", "givenName": "Robin" },
    { "familyName": "Miller", "givenName": "Ben" }
],
"children": [
    {
        "familyName": "Merriam", 
        "givenName": "Jesse", 
        "gender": "female", 
        "grade": 1,
        "pets": [
            { "givenName": "Goofy" },
            { "givenName": "Shadow" }
        ]
    },
    { 
      "familyName": "Miller", 
      "givenName": "Lisa", 
      "gender": "female", 
      "grade": 8 
    }
],
  "address": { "state": "NY", "county": "Manhattan", "city": "NY" },
  "isRegistered": false
};
如何查询宠物名为“高飞”的儿童

看起来以下语法无效

Select * from root r
WHERE r.children.pets.givenName="Goofy"
相反,我需要这样做

Select * from root r
WHERE r.children[0].pets[0].givenName="Goofy"
这并不是在数组中搜索


关于我应该如何处理这些查询有什么建议吗?

您应该利用DocumentDB的
JOIN
子句,它的操作与RDBMs中的
JOIN
稍有不同(因为DocumentDB处理的是无模式文档的非规范化数据模型)

简单地说,您可以将DocumentDB的
JOIN
看作是自连接,可用于在嵌套JSON对象之间形成交叉乘积

在查询宠物名为“Goofy”的儿童的上下文中,您可以尝试:

SELECT 
    f.id AS familyName,
    c AS child,
    p.givenName AS petName 
FROM Families f 
JOIN c IN f.children 
JOIN p IN c.pets
WHERE p.givenName = "Goofy"
返回:

[{
    familyName: WakefieldFamily,
    child: {
        familyName: Merriam,
        givenName: Jesse,
        gender: female,
        grade: 1,
        pets: [{
            givenName: Goofy
        }, {
            givenName: Shadow
        }]
    },
    petName: Goofy
}]
参考:

编辑:

您还可以使用
ARRAY\u CONTAINS
函数,该函数如下所示:

SELECT food.id, food.description, food.tags
FROM food
WHERE food.id = "09052" or ARRAY_CONTAINS(food.tags.name, "blueberries")

我认为自2014年回答此问题以来,ARRAY_CONTAINS函数发生了变化。我必须使用以下工具才能工作

SELECT * FROM c
WHERE ARRAY_CONTAINS(c.Samples, {"TimeBasis":"5MIN_AV", "Value":"5.105"},true)

Samples是我的JSON数组,它包含具有许多属性的对象,包括上述两个属性。

谢谢您的回答。。我了解到我只需要加入阵列,而不是每个节点。再次感谢您,节省了我的时间。如何使用Linq执行此操作?由于某些原因,选择f*无效?我必须手动指定根元素的所有属性?您只需使用SELECT f获取根文档下的所有属性。我正在azure docdb查询资源管理器中尝试使用此语句[SELECT*from c where array_contains(c.Parents.FirstName,“Ben”)],使用示例记录条目获取空结果,但[select*from c where c.LastName=“Wakefield”]。意外地出现了更复杂的join语句[select f.LastName作为familyName,p作为Familes中的父项f join p in f.Parents where p.FirstName=“Ben”]行得通。关于我忽略了什么以使更简单的数组包含方法起作用,或者我应该去哪里理解为什么使用上面的q/a细节我所期望的方法不起作用,有什么见解吗?这很有帮助。但即使这样做对我来说也不起作用。我必须在引号中加上
timebase
,就像你对“Value”所做的那样“@Krumelur谢谢你的提醒,只是我的答案中有一个输入错误。:-)