Estaba navegando por Couchbase foros y me encontré con una pregunta acerca de las consultas contra los datos de matriz en Couchbase. Viniendo de una base de datos relacional, yo también luché una vez para entender el concepto de consulta de datos JSON con formato complejo con SQL.
¿Cómo se consulta dentro de estos documentos NoSQL incrustados? Existen numerosas formas, ninguna de las cuales es especialmente difícil. Vamos a examinar algunas de las posibilidades de consulta complejas.
En caso de que tenga curiosidad sobre la pregunta con la que tropecé, se puede encontrar aquí. El usuario quería saber cómo consultar objetos anidados en una matriz para un único documento. El modelo de documento propuesto era similar al siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{ "id": "order-1", "tipo": "orden", "items": [ { "id": "pokemon-azul", "tipo": "juego", "Nombre": "Pokemon Azul" }, { "id": "ms-surface-book", "tipo": "informática", "nombre": "Microsoft Surface Book" } ] } |
El objetivo final era poder obtener cada objeto en una consulta basada en un DONDE
que incluía la condición anidada tipo
propiedad.
Una forma de hacerlo es escribir una consulta N1QL parecida a la siguiente:
1 2 3 4 5 |
SELECCIONE forum.id, forum.type, item DESDE el foro UNNEST items AS item WHERE item.type != "computing"; |
En la consulta anterior estamos realizando una SELECCIONE
desde un Bucket Couchbase llamado foro
y aplanando la matriz mediante la función UNNEST
palabra clave. Antes de aplicar la palabra clave DONDE
estado:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[ { "id": "order-1", "item": { "id": "pokemon-azul", "Nombre": "Pokemon Azul", "tipo": "gaming" }, "tipo": "orden" }, { "id": "order-1", "item": { "id": "ms-surface-book", "nombre": "Microsoft Surface Book", "tipo": "informática" }, "tipo": "orden" } ] |
En DONDE
nos devolverá un único resultado en lugar de dos, donde el único resultado es de tipo juegos
según nuestra consulta.
¿Es ésta la única manera de conseguir lo que acabamos de hacer? Por supuesto que no.
Tomemos la siguiente consulta N1QL:
1 2 3 4 5 |
SELECCIONE forum.id, foro.tipo, ARRAY item FOR item IN forum.items WHEN item.type != 'computing' END AS item DESDE el foro |
En la consulta anterior no estamos aplanando primero el array en Couchbase con un UNNEST
operación. En su lugar estamos utilizando uno de los operadores de recogida para encontrar elementos de la matriz que cumplan nuestros criterios.
¿Hay otras maneras de hacer el trabajo? Por supuesto que las hay, pero estas dos deberían ser suficientes para empezar cuando se trata de consultar arrays en Couchbase con N1QL y la aplicación UNNEST
palabra clave.
Si necesitas más ayuda con N1QL, consulta la página Portal para desarrolladores de Couchbase para ver otros ejemplos.
[...] un artículo reciente, escribí sobre aplanar y consultar arrays en Couchbase usando N1QL. Ese artículo fue inspirado por una pregunta popular en los foros de Couchbase. Después de publicar el [...]
¿Hay alguna forma de anidar estos resultados en una matriz? Por ejemplo:
{
"id": "order-1",
"tipo": "orden",
"items": [
{
"id": "pokemon-azul",
"tipo": "juego",
"Nombre": "Pokemon Azul"
}
]
}