nosql – 在Azure DocumentDb中的数组上的WHERE子句

前端之家收集整理的这篇文章主要介绍了nosql – 在Azure DocumentDb中的数组上的WHERE子句前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在这样的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","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子句,它与RDBM中的JOIN有所不同(因为DocumentDB处理无模式文档的denormlaize数据模型).

简单来说,您可以将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
}]

参考:http://azure.microsoft.com/en-us/documentation/articles/documentdb-sql-query/

编辑:

您还可以使用ARRAY_CONTAINS功能,如下所示:

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

猜你在找的NoSQL相关文章