Azure DocumentDb中数组的WHERE子句

Avi*_*aju 27 nosql azure-cosmosdb

在像这样的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
};
Run Code Online (Sandbox Code Playgroud)

如何查询给名字的宠物是"高飞"的孩子?

看起来以下语法无效

Select * from root r
WHERE r.children.pets.givenName="Goofy"
Run Code Online (Sandbox Code Playgroud)

相反,我需要这样做

Select * from root r
WHERE r.children[0].pets[0].givenName="Goofy"
Run Code Online (Sandbox Code Playgroud)

这不是真正搜索数组.

关于如何处理这类查询的任何建议?

And*_*Liu 43

您应该利用DocumentDB的JOIN子句,该子句的操作JOIN与RDBM中的操作略有不同(因为DocumentDB处理无架构文档的非规范化数据模型).

简单地说,您可以将DocumentDB JOIN视为自连接,可用于在嵌套JSON对象之间形成交叉产品.

在查询名字为"高飞"的孩子的情况下,您可以尝试:

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

哪个回报:

[{
    familyName: WakefieldFamily,
    child: {
        familyName: Merriam,
        givenName: Jesse,
        gender: female,
        grade: 1,
        pets: [{
            givenName: Goofy
        }, {
            givenName: Shadow
        }]
    },
    petName: Goofy
}]
Run Code Online (Sandbox Code Playgroud)

参考: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")
Run Code Online (Sandbox Code Playgroud)


Nic*_*las 8

我认为 ARRAY_CONTAINS 函数自 2014 年回答以来发生了变化。我必须使用以下内容才能使其工作。

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

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