Подтвердить что ты не робот

Предложение WHERE в массиве в Azure DocumentDb

В документе 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"

который на самом деле не ищет массив.

Любое предложение о том, как я должен обрабатывать такие запросы?

4b9b3361

Ответ 1

Вам следует использовать предложение DocumentDB JOIN, которое работает в битве RDBM немного иначе, чем JOIN (так как DocumentDB использует w/denormlaized модель данных документов без схемы).

Проще говоря, вы можете думать о 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/

Edit:

Вы также можете использовать функцию ARRAY_CONTAINS, которая выглядит примерно так:

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