2014-12-09 9 views
23

w dokumencie Azure Documentdb jak tenWHERE na tablicy w 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 
}; 

Jak mogę dostać zapytanie do dzieci, których zwierzaki imię jest „Goofy”?

wygląda następująco składnia jest nieprawidłowy

Select * from root r 
WHERE r.children.pets.givenName="Goofy" 

Zamiast muszę zrobić

Select * from root r 
WHERE r.children[0].pets[0].givenName="Goofy" 

który nie jest naprawdę szukanego przez tablicę.

Wszelkie sugestie dotyczące sposobu obsługi takich kwerend?

Odpowiedz

32

Należy wykorzystać DocumentDB za JOIN klauzuli, która działa nieco inaczej niż JOIN w RDBMS (ponieważ DocumentDB zajmuje w/denormlaized modelu danych schematu darmo dokumentów).

Mówiąc prościej, można pomyśleć o JOIN DocumentDB jako o samoczynnych łączeniach, które mogą być używane do tworzenia produktów między zagnieżdżonymi obiektami JSON.

W kontekście zapytań dzieci, których zwierzaki imię jest "Goofy", można spróbować:

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" 

Które zwraca:

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

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

Edit:

You ca n również użyć funkcji ARRAY_CONTAINS, która wygląda mniej więcej tak:

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

Dzięki za odpowiedź .. Nauczyłem się, że muszę dołączyć tylko do tablicy, ale nie do każdego węzła w dół. Jeszcze raz dziękuję, uratowałem mój dzień. –

+0

jak to zrobić, używając Linq? –

+0

wybierz f. * Jest nieważny z jakiegoś powodu? Muszę ręcznie określić wszystkie atrybuty elementu głównego? –

Powiązane problemy