¿Cómo hacer "algo" en N1QL?
En primer lugar, si no está familiarizado con N1QL le recomiendo que dedique unos minutos a nuestra formación gratuita sobre N1QL aquío simplemente jugar con él aquí.
En segundo lugar, como se trata de una pregunta amplia, repasemos algunas situaciones habituales:
Selecciona el id de un documento y todos sus atributos:
1 |
Seleccione meta(t).id como id, t.* de `miCubo` t donde tipo = algúnTipo |
Cómo escribir un JOIN:
Vamos a consultar qué compañías vuelan desde el aeropuerto de San Francisco (SFO) a cualquier lugar del mundo utilizando la muestra de viajes:
1 2 3 4 5 6 7 |
SELECCIONE aerolínea.nombre, aerolínea.Indicativo, ruta.destinoaeropuerto, ruta.para, ruta.aerolínea DESDE `viaje-muestra` ruta ÚNASE A `viaje-muestra` aerolínea EN TECLAS ruta.airlineid DONDE ruta.tipo = "ruta" Y aerolínea.tipo = "aerolínea" Y ruta.fuenteaeropuerto = "OFS" Y ruta.para = 0 PEDIR POR aerolínea.nombre |
En ÚNASE A se parece a un JOIN SQL estándar, la única diferencia aquí es la cláusula EN TECLAS palabra clave, para leer más al respecto consulte este artículo que explica visualmente N1QL JOINs. Couchbase 5.5 también añadirá soporte para UNIONES ANSI
Cómo seleccionar elementos de un array:
Dados documentos como:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ tipo: "persona", nombre: "John", niños: [ { "nombre": "Pedro", "edad": 8 }, { "nombre": "George", "edad": 11 } ] } |
Si queremos seleccionar a todos los niños de más de 10 años, podemos utilizar la función UNNEST palabra clave:
1 |
SELECCIONE c.* DESDE tutorial t UNNEST t.niños c DONDE c.edad > 10 |
¿Por qué mi consulta es lenta?
Probablemente su consulta no está afectando a ningún índice. Puede comprobarlo ejecutando su consulta con la función explique de la siguiente manera:
Como se puede ver en la imagen de arriba, la consulta está golpeando el PrimaryScan lo que significa que está utilizando el índice primario. La creación de un índice secundario resolverá potencialmente su problema:
Ejecutando de nuevo la misma consulta se obtendrá algo parecido a:
Si su consulta ya está golpeando un índice, pero todavía tiene un rendimiento pobre, es posible que desee añadir un índice más optimizado (como en este ejemplo). Si no está familiarizado con cómo crear un índice, consulte esta entrada del blog
¿Cómo paginar los resultados en N1QL?
Puede utilizar LÍMITE y OFFSET:
1 |
seleccionar * de `viaje-muestra` donde país = Estados Unidos OFFSET 10 LÍMITE 10 |
Echa un vistazo este tutorial para leer más al respecto. Además, si utiliza Spring Data, puede añadir un archivo Pageable al final de la definición del método:
Y luego, en su Servicio puede utilizar la función Petición de página objeto:
En mi consulta faltan resultados o los resultados son erróneos
Por defecto, Couchbase soporta leer después de escribir siempre que obtengas un documento por su clave, pero tus índices y vistas se actualizan de forma asíncrona a través del Protocolo de Cambio de Datos (DCP). Por lo tanto, si ejecutas una consulta justo después de una escritura, puede que se ejecute antes de que las vistas/índices hayan tenido la oportunidad de actualizarse.
Couchbase es todo velocidad, y nadie tiene tiempo de esperar hasta que todos los índices y vistas estén actualizados para enviar la respuesta al cliente de que una escritura se ha ejecutado con éxito.
Pero hay pocos escenarios donde una fuerte consistencia entre escrituras y tus consultas son realmente necesarias, para esos casos puedes especificar vía SDK que realmente quieres esperar hasta que el índice/vista que estás usando sea actualizado:
Para obtener más información sobre la coherencia del escaneado, consulte la página documentación oficial.
En mi experiencia personal, el único escenario en el que necesito coherencia entre escrituras y consultas es durante el pruebas de integración que es cuando realmente se insertan los datos y se consultan justo después.
Cómo crear/utilizar índices de matrices.
Se trata de un tema interesante, ya que indexación de matrices puede acelerar significativamente su rendimiento. Supongamos que tenemos la siguiente estructura de documento:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
{ "dirección": "Capstone Road, ME7 3JE", "alias": null, "ciudad": "Medway", "país": "Reino Unido", "descripción": "Albergue de verano de 40 camas a unos 5 km de Gillingham, ubicado en una intrincada Oast House reconvertida en un entorno semirural"., "direcciones": null, "email": null, "fax": null, ... "id": 10025, "nombre": "Albergue Juvenil Medway", "pets_ok": verdadero, "teléfono": "+44 870 770 5964", "precio": null, "revisiones": [ { "autor": "Ozella Sipes", "contenido": "Alguna reseña aquí...", "fecha": "2013-06-22 18:33:50 +0300", "clasificaciones": { "Limpieza": 5, "Ubicación": 4, "En general": 4, "Habitaciones": 3, "Servicio": 5, "Valor": 4 } } ] } |
Ahora, si necesitamos consultar reseñas de hoteles, podríamos hacer algo como:
1 |
SELECCIONE c.* DESDE `viaje-muestra` t UNNEST t.reseñas c donde t.tipo == "hotel" límite 100 |
Así pues, el índice más sencillo para el reseñas matriz se se parecen a las siguientes:
1 |
CREAR ÍNDICE idx EN `viaje-muestra` (reseñas) DONDE tipo = "hotel"; |
Y luego, cuando ejecutamos la consulta, voilà:
Está utilizando el índice creado recientemente.
Para más ejemplos, consulte la página documentación oficial o leer este excelente artículo sobre cómo optimizar los índices de las matrices.