azure cosmosdb - que - Cláusula WHERE en una matriz en Azure DocumentDb
cosmos db vs mongodb (2)
En un documento de Azure Documentdb como este
{
"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
};
¿Cómo puedo consultar para obtener niños cuyos nombres de mascotas son "Goofy"?
Parece que la siguiente sintaxis no es válida
Select * from root r
WHERE r.children.pets.givenName="Goofy"
En cambio necesito hacer
Select * from root r
WHERE r.children[0].pets[0].givenName="Goofy"
que no está realmente buscando a través de una matriz.
¿Alguna sugerencia sobre cómo debo manejar consultas como estas?
Creo que la función ARRAY_CONTAINS ha cambiado desde que se contestó en 2014. Tenía que usar lo siguiente para que funcionara.
SELECT * FROM c
WHERE ARRAY_CONTAINS(c.Samples, {TimeBasis:"5MIN_AV", "Value":"5.105"},true)
Samples es mi matriz JSON y contiene objetos con muchas propiedades, incluidas las dos anteriores.
Debe aprovechar las ventajas de la cláusula JOIN
de DocumentDB, que funciona de forma un poco diferente a JOIN
en RDBMs (ya que DocumentDB trata con un modelo de datos no estructurado de documentos sin esquema).
En pocas palabras, puede pensar que la combinación de DocumentDB es una auto-unión que se puede usar para formar productos cruzados entre objetos JSON anidados.
En el contexto de consultar a los niños cuyas mascotas reciben el nombre de "Goofy", puede intentar:
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"
Que devuelve:
[{
familyName: WakefieldFamily,
child: {
familyName: Merriam,
givenName: Jesse,
gender: female,
grade: 1,
pets: [{
givenName: Goofy
}, {
givenName: Shadow
}]
},
petName: Goofy
}]
Referencia: http://azure.microsoft.com/en-us/documentation/articles/documentdb-sql-query/
Editar:
También puede usar la función ARRAY_CONTAINS
, que se parece a esto:
SELECT food.id, food.description, food.tags
FROM food
WHERE food.id = "09052" or ARRAY_CONTAINS(food.tags.name, "blueberries")