Dans un document Azure Documentdb comme celui-ci
{
"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
};
Comment interroger les enfants dont le prénom est "Goofy"?
On dirait que la syntaxe suivante est invalide
Select * from root r
WHERE r.children.pets.givenName="Goofy"
Au lieu de cela je dois faire
Select * from root r
WHERE r.children[0].pets[0].givenName="Goofy"
qui ne cherche pas vraiment dans un tableau.
Toute suggestion sur la façon dont je devrais gérer des requêtes comme celles-ci?
Vous devriez tirer parti de la clause JOIN
de DocumentDB, qui fonctionne un peu différemment de JOIN
dans les RDBM (puisque DocumentDB traite avec un modèle de données dénormlé de documents sans schéma).
Pour le dire simplement, vous pouvez considérer la variable JOIN
de DocumentDB comme des auto-jointures pouvant être utilisées pour former des produits croisés entre des objets JSON imbriqués.
Dans le contexte d'interrogation d'enfants dont le nom d'animal est "Goofy", vous pouvez essayer:
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"
Qui retourne:
[{
familyName: WakefieldFamily,
child: {
familyName: Merriam,
givenName: Jesse,
gender: female,
grade: 1,
pets: [{
givenName: Goofy
}, {
givenName: Shadow
}]
},
petName: Goofy
}]
Référence: http://Azure.Microsoft.com/en-us/documentation/articles/documentdb-sql-query/
Modifier:
Vous pouvez également utiliser la fonction ARRAY_CONTAINS
, qui ressemble à ceci:
SELECT food.id, food.description, food.tags
FROM food
WHERE food.id = "09052" or ARRAY_CONTAINS(food.tags.name, "blueberries")
Je pense que la fonction ARRAY_CONTAINS a changé depuis sa réponse en 2014. J'ai dû utiliser les éléments suivants pour que cela fonctionne.
SELECT * FROM c
WHERE ARRAY_CONTAINS(c.Samples, {TimeBasis:"5MIN_AV", "Value":"5.105"},true)
Samples est mon tableau JSON et il contient des objets avec de nombreuses propriétés, y compris les deux ci-dessus.