*Ba Dum Tschhh* ...¿Ves lo que he hecho? ¿Hace centavos? ¿Lo pillas? Haha.
Así que... N1QL (pronunciado Nickel)... el nuevo lenguaje de consulta de nueva generación de Couchbase; ¿qué es? Bueno, es un lenguaje extensible, legible por humanos, diseñado para consultas ad-hoc y operacionales dentro de Couchbase. Para aquellos que ya estén familiarizados con las consultas dentro de Couchbase, este fragmento probablemente tenga sentido para ustedes. Si no, probablemente no, así que permítanme aclararlo un poco más.
Pero antes de hacerlo, debo informarte de que este artículo del blog no es el mejor lugar para que vayas si quieres sumergirte y empezar a aprender N1QL. Es una visión de N1QL desde la perspectiva de un desarrollador, incluyendo por qué estoy tan entusiasmado con él, y las características que estoy orgulloso de señalar. Si quieres empezar a aprender sobre N1QL, pulse aquí. O si lo prefiere, vaya y pruebe el Tutorial en línea. De todos modos, volviendo a aclarar lo que quiero decir cuando digo N1QL...
"N1QL es similar al lenguaje SQL estándar para bases de datos relacionales, pero también incluye características adicionales; que son adecuadas para bases de datos orientadas a documentos". N1QL se ha diseñado como un lenguaje de consulta intuitivo para bases de datos estructuradas en torno a documentos en lugar de tablas. Para localizar y utilizar información en una base de datos orientada a documentos, es necesario disponer de la lógica y las expresiones correctas para navegar por los documentos y sus estructuras. N1QL proporciona una capa de abstracción clara y fácil de entender para consultar y recuperar información en su base de datos documental.
Antes de seguir adelante con N1QL, vamos a hablar rápidamente sobre el modelado de documentos dentro de Couchbase. Como probablemente sepas, en Couchbase modelamos nuestros documentos principalmente en JSON. Todos estamos familiarizados con JSON, así que no voy a entrar en detalles, pero una cosa que tenemos que tener en cuenta es el hecho de que: nuestros documentos JSON pueden tener estructuras de datos anidadas complejas, matrices anidadas y objetos que normalmente harían que la consulta fuera un problema. Contrario a SQL, N1QL tiene la habilidad de navegar datos anidados porque soporta el concepto de caminos. Esto es muy guay. Podemos usar caminos utilizando una sintaxis de anotación por puntos para darnos la ubicación lógica de un atributo dentro de un documento. Por ejemplo, si tuviéramos un sitio de comercio electrónico con documentos que contuvieran los pedidos de los clientes, podríamos buscar atributos dentro de esos documentos, hasta un enésimo nivel anidado. Así que si quisiéramos buscar la calle de envío del cliente:
Muy chulo, ¿verdad? Este es también uno de los grandes diferenciadores que distinguen a este lenguaje de consulta de SQL.
Como la mayoría de los que leen esto, yo también procedo de SQL. Creo que puedo asumir que 99% de ustedes también, ¿verdad? Si es así, te darás cuenta de que N1QL no sólo parece familiar, pero se siente familiar también, lo que nos da un sentido instantáneo de valor debido al hecho de que casi sabemos la sintaxis sin aprender nada nuevo.
Ahora vamos a ejecutar algunas consultas y ver qué pasa. Para estas consultas, las ejecutaré contra el cubo de datos de ejemplo "tutorial" tal y como se ve en el tutorial en línea / tutorial de Developer Preview. En primer lugar, veamos cómo se forman las consultas:
Una consulta básica consta de tres partes:
- SELECCIONE - Partes del documento a devolver
- DESDE - El bucket de datos, o almacén de datos con el que trabajar
- DONDE - Condiciones que debe cumplir el documento
En realidad, la consulta sólo requiere la cláusula SELECT. Si ejecutamos la cláusula SELECT con un comodín *, estaremos seleccionando todas las partes del documento. Así que si ejecutamos la siguiente consulta
DE tutorial
WHERE fname = 'Dave
Devolveremos el datos como se ve aquí...
Teniendo en cuenta lo que hemos aprendido antes sobre las estructuras de datos anidadas, si cambiáramos ese * comodín para utilizar uno de los atributos anidados del documento 'niños en lugar del comodín *, podemos devolver de nuestra consulta sólo un fragmento del documento.
Así que corriendo:
DE tutorial
WHERE fname = 'Dave
Volveremos:
"resultset": [
{
"niños": [
{
"edad": 17,
"fname": "Aiden",
"género": "m"
},
{
"edad": 2,
"fname": "Bill",
"género": "m"
}
]
}
]
}
Ahora recuerde, tenemos SIN ESQUEMA FIJO en Couchbase para no perder nada de la increíble flexibilidad que nos encanta de Couchbase. Ahora, cuando digo que no tenemos un esquema fijo, quiero decir que Couchbase no impone un esquema; pero nuestros documentos, por supuesto, tienen estructura, dado que son documentos JSON.
La consulta N1QL funciona contra documentos, no contra filas o columnas, al contrario que las bases de datos relacionales. Dado que los documentos pueden tener atributos anidados y matrices incrustadas, se necesitan unos cuantos operadores son necesarios. En N1QL, tenemos un '.' que se utiliza para referirse a los hijos, y un operador '[ ]' que se utiliza para referirse a un elemento de una matriz. En realidad, podemos utilizar una combinación de los operadores para acceder a datos de cualquier profundidad en un documento.
Por ejemplo, si ejecutamos la consulta
DE tutorial
WHERE fname='Dave'
Aquí obtenemos el nombre del primer hijo y lo asignamos explícitamente a 'cname'. Los atributos de los documentos hijos se pueden asignar explícitamente mediante la función AS cláusula.
El resultado que devolvemos de esa consulta es:
"resultset": [
{
"fname": "Aiden"
}
]
}
Las bases de datos de documentos como Couchbase a menudo almacenan metadatos sobre un documento fuera del documento. En N1QL, utilizamos el META()' para acceder a los metadatos de cada documento de la base de datos del tutorial de ejemplo. De esta consulta, los únicos campos que vamos a devolver son los metadatos del documento. La consulta es la siguiente
DE tutorial
Y los resultados puede verse aquí...
En las consultas anteriores, utilizamos el "DONDE para buscar un único documento, pero también podemos utilizar otros operadores de comparación para buscar varios documentos. Supongamos, por ejemplo, que queremos encontrar a todas las personas de nuestra base de datos cuya edad sea superior a 30 años; podemos ejecutar la siguiente consulta:
DE tutorial
WHERE edad > 30
Que devolverá este conjunto de resultados...
Se admiten todos los operadores de comparación estándar, como (>, >=, <, <=, = y !=). Todas estas comparaciones también tienen en cuenta el tipo del valor, por lo que puntuación > 8devolverá los documentos que contengan una puntuación numérica superior a 8.
Una de las características más interesantes, en mi opinión, es la forma en que podemos hacer coincidir patrones utilizando la función LIKE en la cláusula WHERE. Digamos, por ejemplo, que necesitamos encontrar a todas las personas de nuestra base de datos que tengan una dirección de correo electrónico con yahoo.com. Podemos ejecutar una consulta utilizando el operador 'LIKE' para buscar las direcciones de correo electrónico. En esta consulta, utilizaremos "%" como comodín que coincidirá con 0 o más caracteres. También podríamos utilizar "_" si quisiéramos que coincidiera exactamente con un carácter. Así pues, la consulta para encontrar a todas las personas de nuestra base de datos que utilicen una dirección de correo electrónico de yahoo.com es:
DE tutorial
WHERE email LIKE '%@yahoo.com'
Como puede ver, hemos incluido el LIKE en nuestra cláusula WHERE para que coincida con las direcciones de correo electrónico. El conjunto de resultados que devolverá la consulta es el siguiente...
"resultset": [
{
"email": "harry@yahoo.com",
"fname": "Harry"
}
{
"email": "dave@yahoo.com",
"fname": "Dave"
}
]
}
Personalmente, ¡creo que esta es una de las características más útiles de N1QL! Pero digamos que queremos hacer lo contrario de lo que acabamos de hacer, y queremos listar todas las personas que no coinciden con la dirección de correo electrónico yahoo.com. Otra función muy útil es la función 'NO ME GUSTA que podemos utilizar para encontrar documentos que no coincidan con el patrón.
Por supuesto, podemos combinar varias condiciones utilizando la función 'Y operador. Por ejemplo, si quisiéramos devolver personas que tienen al menos un hijo y una dirección de correo electrónico de gmail, ejecutaríamos:
DE tutorial
WHERE LENGTH(children) > 0 AND email LIKE '%@gmail.com'
También podríamos sustituir esteY con el operador 'O para que coincida con varias condiciones.
Las similitudes con las consultas SQL continúan cuando pasamos a ordenar y paginar los resultados de nuestras consultas. N1QL ha incluido el conocido ORDENAR POR para poder ordenar los resultados de la consulta. Las consultas pueden producir muchos resultados si tenemos un conjunto de datos muy grande, por lo que es posible que queramos paginar nuestros resultados. Buenas noticias. También podemos hacerlo. Una consulta que incluya una cláusula ORDENAR POR y una cláusula LÍMITE paginador podría tener el siguiente aspecto:
DE tutorial
ORDER BY edad
LÍMITE 2
Podemos crear agregados de datos en nuestro conjunto de datos utilizando comandos como el comando COUNT()' que nos dirá cuántos documentos hay en nuestro cubo. También podemos agrupar nuestros datos utilizando la conocida función 'GROUP BY' . Si quisiéramos filtrar el conjunto de resultados en función de los grupos devueltos, podemos utilizar la cláusula 'TENIENDO donde habríamos utilizado la cláusula 'DONDE para filtrar documentos.
Si quisiéramos devolver sólo los grupos que tienen más de un miembro, podemos escribir una consulta como la siguiente:
DE tutorial
GROUP BY relación
TENER COUNT(*) > 1
Una última característica que me gustaría mencionar es el hecho de que podemos hacer uniones dentro de un documento (también denominadas anidamiento o aplanamiento). Esto significa que podemos tomar el contenido de matrices anidadas y unirlas con el objeto padre. Así, por ejemplo, si queremos unir Dave con cada uno de sus 2 hijos, podemos escribir una consulta como la siguiente:
FROM tutorial AS contact
OVER niño IN contacto.niños
WHERE contacto.fname = 'Dave'
Esta consulta devolvería el conjunto de resultados como que puedes ver aquí...
Bueno, con esto he terminado las características de N1QL que realmente quería mostrar. Personalmente, creo que este es uno de los proyectos más emocionantes de Couchbase, me encanta la sintaxis de N1QL y creo que el proyecto en sí es fantástico.
Si desea empezar a utilizar N1QL, puede descargar la versión preliminar para desarrolladores visitando la página N1QL de nuestro portal comunitario.
Si desea profundizar en el tutorial en línea de 15 minutos, puede hágalo aquí.
Y si quieres una guía más detallada de la Developer Preview de N1QL, puedes consultar la documentación oficial en haciendo clic aquí.
Espero que este blog te haya inspirado para empezar a usar N1QL, ya que es increíblemente divertido de usar y una pieza muy cool de la tecnología. Si usted tiene alguna pregunta sobre sus aventuras en el mundo N1QL, os animo a preguntar en nuestro Portal comunitario N1QL y los profesionales le responderán.
¡Anímate y sumérgete en el mundo N1QL! ¡Nos vemos allí!
- Robin Johnson
Defensor del Desarrollador, Europa
¡Genial!
Es bastante, ¿no?
Interesante. ¿Tiene NIQL algún operador para construir documentos de resultados arbitrarios? Por ejemplo, supongamos que quiero convertir el documento tutorial "dave" en algo como esto:
{
conjunto de resultados: [{
edad: 17,
fname: \"Aiden",
género: \"m\",
padre: {
fname: \"Dave",
correo electrónico: \dave@gmail.com
aficiones: [\ "golf",\ "surf"],
lname: \"Smith",
relación: \"amigo",
título: \"Señor",
tipo: \contacto
}
},{
edad: 2,
fname: \"Bill\",
género: \"f\",
padre: {
fname: \"Dave",
correo electrónico: \dave@gmail.com
aficiones: [\ "golf",\ "surf"],
lname: \"Smith",
relación: \"amigo",
título: \"Señor",
tipo: \contacto
}
}]
}
Roland, disculpa el retraso en responder. Sí, N1QL permite construir transformaciones y resultados arbitrarios. En el tutorial, la siguiente consulta producirá los resultados que quería:
SELECT * FROM tutorial parent OVER parent.children WHERE parent.fname = \ "Dave\"
-gerald
¡Gerald, gracias!
Ahora estoy un poco confundido. Parece exactamente la misma consulta (excepto por el alias) que la que describe en la función "uniones en el documento". Sin embargo, el conjunto de resultados dado para esa consulta es diferente, ya que hay propiedades "child" en las que están contenidas las propiedades child, mientras que en mi conjunto de resultados de ejemplo esas propiedades están en el objeto de nivel superior.
¿Me estoy perdiendo o malinterpretando algo?
Hola Roland,
Intentaba simplificar la consulta :). Siempre puedes proyectar cualquier subconjunto en el resultado. La siguiente consulta produce sus resultados precisos:
SELECT parent, children.age, children.fname, children.gender FROM tutorial parent OVER parent.children WHERE parent.fname = \"Dave\"
Gracias. Supongo que podría haberlo adivinado, pero me alegro de la explicación. ¡Genial!
Me olvidé de añadir - Me doy cuenta de esta entrada del blog ya es bastante largo, pero realmente apreciaría una explicación más formal / completa de cómo funciona el operador OVER. ¿Tiene un enlace? TIA, Roland.
Roland,
Hay un poco aquí, aunque podemos (y lo haremos) añadir a la documentación:
http://docs.couchbase.com/couc…
Para su información, en la próxima versión preliminar para desarrolladores, la sintaxis FROM ... OVER se convertirá en FROM ... UNNEST, que consideramos más descriptiva.
En esencia, es conceptualmente unir un array anidado con su documento u objeto padre, para crear una lista de pares .
No dude en preguntarnos, estaremos encantados de responderle.
Gracias por los elogios.
Hola, estoy interesado en saber más sobre el funcionamiento interno del lenguaje de consulta N1QL. Específicamente me gustaría saber si devuelve sólo los documentos que se persistieron en el disco? ¿Utiliza vistas Couchbase para realizar la consulta? ¿Qué hay de los problemas de rendimiento?
¿Dónde puedo encontrar respuestas a estas preguntas?
Gracias
N1QL utiliza actualmente vistas Couchbase. Como tal, actualmente devuelve documentos que son visibles para las vistas, y su rendimiento se basa en el rendimiento de las vistas.
Estamos trabajando en un conjunto dedicado de índices para N1QL. N1QL soportará tanto los nuevos índices como las vistas de Couchbase. También estamos trabajando en el rendimiento de las vistas de Couchbase.
También puede enviar sus preguntas directamente a consulta.couchbase.com.
Sé que esto es de reciente lanzamiento, pero es N1QL disponible en couchbase Lite? Tengo una aplicación en la que estoy trabajando que permite la base de datos de forma libre, por lo que no sería capaz de pre-crear puntos de vista, por lo que la consulta ad-hoc sería lo que necesito.
N1QL no está disponible actualmente en Couchbase Lite pero lo estamos considerando para el futuro. En cuanto a lo que deberías usar ahora mismo, nos ayudaría tener más información sobre lo que estás intentando hacer. El mejor lugar para publicar tus preguntas técnicas para Couchbase Mobile, incluyendo Couchbase Lite, sería nuestro grupo móvil de Google: https://groups.google.com/foru…
¿Requiere el motor una versión concreta del servidor Couchbase o puede funcionar con versiones anteriores, por ejemplo, la 2.5?
Funciona con Couchbase server 2.5.1.
cuándo es la fecha de lanzamiento para que los desarrolladores puedan utilizarlo en un entorno de producción.
Todavía se están elaborando los planes de lanzamiento, pero el plan provisional es que esté disponible en el primer semestre de 2015.
Antes de eso, sin embargo, proporcionaremos vistas previas, así que póngase en contacto con nosotros, ya que nos encantaría conocer su caso de uso y obtener más información sobre su uso previsto para N1QL. Queryinfo en consulta.couchbase.com y también puede ponerse en contacto a través de http://forums.couchbase.com/c/…
¿Podemos iterar sobre arrays mientras realizamos operaciones de actualización en Couchbase 4.0 y N1QL Server? Como por ejemplo :
\UPDATE mybucket SET address.location='Office\' OVER child IN address WHERE child.type = \'Home\' END\"
(aquí la dirección es un array).
¿Podemos realizar la consulta anterior?
¿En qué idioma está escrito este código?کرکره برقی
¿Cómo es el estado del programa?نهال پسته