Consultar e indexar arrays de documentos es una de las características más potentes de Couchbase. Encontrar entradas en un array dentro de un rango de fechas específico es un requerimiento común. Considera el siguiente caso de uso.
Historia de usuario: "Quiero indexar una matriz de historial de cuentas incrustada dentro de los documentos de mi base de datos para poder realizar una consulta de rango para las entradas de la matriz dentro de un intervalo de fechas específico."
Considere la siguiente estructura json:
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 32 33 34 35 36 37 38 39 40 41 42 43 |
{ "nombre":"", "nombre de usuario":"", "email":"", "dirección":{ "calleA":"", "calleC":"", "calleD":"", "ciudad":"", "estado":"", "país":"", "código postal":"" "geo": { "lat":"", "lng":"" } }, "teléfono":"", "sitio web":"", "empresa": { "nombre":"", "catchPhrase":"", "bs":"" }, "puestos": [ { "palabras":"", "sentencia":"", "sentencias":"", "párrafo":"" },... ], "accountHistory": [ { "importe":"", "fecha":"", "negocios":"", "nombre":"", "tipo":"", "cuenta":"" },... ] } |
Tengo un array llamado accountHistory que podría incluir 0-N número de entradas. Si quiero consultar un determinado intervalo de fechas, puedo hacerlo fácilmente definiendo un índice secundario en el campo fecha campo.
1 2 |
CREAR ÍNDICE rango_fecha EN por defecto(DISTINTO ARRAY v.fecha PARA v EN accountHistory FIN) |
He creado una entrada de índice única utilizando DISTINTO para cada fecha en cada entrada de accountHistory. Esto significa que cada documento en el cluster que tiene un array de accountHistory se incluirán en mi índice siempre que la entrada accountHistory tenga un campo llamado "fecha". Es posible que tenga varios tipos de elementos en la matriz accountHistory y sólo quiero que se incluyan los elementos que tengan un campo de fecha. Si no hay ningún campo de fecha, el indizador no incluirá esa entrada en el índice. Ahora puedo incluir rangos de fechas en mi predicado de consulta:
1 2 3 4 |
SELECCIONE por defecto.correo electrónico, v.cuenta, v.tipo, v.importe, v.nombre, v.correo electrónico DESDE por defecto UNNEST accountHistory v DONDE v.fecha ENTRE '2016-02-01T00:00:00.000Z' Y '2017-06-01T00:00:00.000Z' |
He utilizado una de mis otras características favoritas de N1QL en la consulta: UNNEST. Me permite dar forma al JSON e incluir campos de nivel de documento raíz en mis resultados. En mi consulta, cada entrada devuelta incluirá la información del historial de la cuenta que esté dentro del intervalo de fechas de mi predicado. También quiero que se incluya la dirección de correo electrónico del documento del que procede, y no quiero tener que escribir lógica de análisis JSON adicional para desgranarla en mi aplicación. Ese es el poder de usar unnest. La consulta devuelve lo siguiente:
1 2 3 4 5 6 7 8 9 |
"resultados": [ { "cuenta": "68475391", "importe": "416.37", "fecha": "2016-02-01T00:00:00.000Z", "email": "Emmanuel.Labadie72@gmail.com", "nombre": "Cuenta de tarjeta de crédito 0008", "tipo": "factura" },... |
Pruébalo: Docker es mi forma favorita de crear un entorno de desarrollo. Un repositorio fácil de usar para los ejemplos anteriores está en github: n1ql-query-nodejs . Utiliza docker-compose para construir dos servicios:
- Un servicio de clúster Couchbase de nodo único.
- Un servicio nodejs para aprovisionar el clúster Couchbase con 250.000 perfiles de usuario e índices para varios ejemplos, incluyendo consultas de rango de fechas para matrices de documentos.