web-dev-qa-db-fra.com

Clause WHERE sur un tableau dans Azure DocumentDb

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?

26
Avinash Gadiraju

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")
40
Andrew Liu

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.

1
Nicholas