El lenguaje de consulta N1QL dispone de un rico conjunto de facilidades para trabajar con arrays JSON. En este artículo, cubriremos constantes de arrays, facilidades para buscar en arrays, formas de transformar arrays, y algunas funciones útiles de N1QL para arrays. El formato es interactivo; abre una instancia de Couchbase y prueba los ejemplos tú mismo.
Para empezar, ve a la consola de administración de tu instancia de Couchbase y crea un bucket llamado "test".
Alternativamente, puede crear el cubo desde la línea de comandos, de la siguiente manera:
curl -X POST -u Administrador:contraseña -d name=prueba -d ramQuotaMB=100 -d authType=sasl -d saslPassword=donotuse -d proxyPort=11224 -d bucketType=couchbase http://localhost:8091/pools/default/buckets
Conéctese a la instancia utilizando el shell CBQ de la siguiente manera:
cbq -e http://localhost:8091 -u Administrador -p contraseña
A continuación, en CBQ, cree un índice primario en su nuevo bucket:
cbq> crear índice primario en test;
Ahora estamos listos para empezar.
Constantes de matriz de Couchbase
En primer lugar, N1QL te permite crear valores de array directamente como constantes de array, así:
cbq> select [1,2,3] as num_array, ["a", "b", "c"] as string_array, ["1", 2, [3, "4"], {"a": "b"}] as mixed_array;
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 |
"resultados": [ { "matriz_mezclada": [ "1", 2, [ 3, "4" ], { "a": "b" } ], "num_array": [ 1, 2, 3 ], "cadena_array": [ "a", "b", "c" ] } ] |
Las constantes pueden incluir incluso valores extraídos de la base de datos:
cbq> insert into prueba (clave, valor) values ("ex1", {"v1" : 7, "v2" : "pájaro", "v3" : 99});
cbq> select [1, v1, 3] as num_array, ["a", v2, "c"] as string_array from test where v3 = 99;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
"resultados": [ { "num_array": [ 1, 7, 3 ], "cadena_array": [ "a", "pájaro", "c" ] } ] |
También se admite la selección de elementos por índice basado en cero:
cbq> select ["manzana", "plátano", "cereza", "dátil", "baya del saúco"][1] as val;
1 2 3 4 5 |
"resultados": [ { "val": "plátano" } ] |
Couchbase Query Arrays y Búsqueda en Arrays
La cláusula IN se utiliza para comprobar la pertenencia.
cbq> select (9 IN [1, 2, 3, 4]) as not_found, (9 in [7, 8, 9]) as is_found;
1 2 3 4 5 6 |
"resultados": [ { "is_found": verdadero, "not_found": falso } ] |
La cláusula ANY se utiliza para verificar que al menos un elemento de la matriz coincide con alguna condición:
cbq> select (CUALQUIER v EN [1, 2, 3, 4, 5] CUMPLE v > 4 END) as is_found, (CUALQUIER v EN [1, 2, 3, 4, 5] CUMPLE v = 7 END) as not_found;
1 2 3 4 5 6 |
"resultados": [ { "is_found": verdadero, "not_found": falso } ] |
La cláusula EVERY se utiliza para verificar que todos los elementos de un array cumplen alguna condición:
cbq> select (EVERY v IN [1, 2, 3, 4, 5] SATISFIES v > 0 END) as is_found, (EVERY v in [-1, 0, 1, 2, 3] SATISFIES v > 0 END ) as not_found;
1 2 3 4 5 6 |
"resultados": [ { "is_found": verdadero, "not_found": falso } ] |
ANY AND EVERY es muy similar a EVERY, pero EVERY es verdadero para matrices vacías, pero ANY AND EVERY es falso:
cbq> select (ANY AND EVERY v IN [] SATISFIES v > 0 END) as any_every_res, (EVERY v IN [] SATISFIES v > 0 END) as every_res;
1 2 3 4 5 6 |
"resultados": [ { "any_every_res": falso, "cada_res": verdadero } ] |
Rebanar
El operador [:] sirve para trocear, es decir, tomar trozos de matrices.
cbq> select [1, 2, 3, 4, 5][1: 3] as res;
1 2 3 4 5 6 7 8 |
"resultados": [ { "res": [ 2, 3 ] } ] |
El primer valor de la expresión slice es el índice por el que se debe empezar (basado en cero); el segundo es el primer índice que se debe excluir. Esta convención debería resultarle familiar de otros lenguajes de programación.
Deben indicarse tanto el inicio como el final de la porción. Los valores negativos enumeran desde el final de la matriz:
cbq> select [1, 2, 3, 4, 5][1: -1] as res;
1 2 3 4 5 6 7 8 9 |
"resultados": [ { "res": [ 2, 3, 4 ] } ] |
Transformación de matrices Couchbase
La expresión ARRAY permite transformar una matriz en otra.
cbq> select ARRAY v*2 FOR v IN [1, 2, 3, 4, 5] END as res;
1 2 3 4 5 6 7 8 9 10 11 |
"resultados": [ { "res": [ 2, 4, 6, 8, 10 ] } ] |
La expresión ARRAY también admite la selección:
cbq> select ARRAY v*2 FOR v IN [1, 2, 3, 4, 5] WHEN v > 2 END as res;
1 2 3 4 5 6 7 8 9 |
"resultados": [ { "res": [ 6, 8, 10 ] } ] |
La expresión de destino puede incluir no sólo cada valor, sino también los índices:
cbq> SELECT ARRAY {v:pos} FOR pos:v IN [ "uno", "dos", "tres" ] END;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
"resultados": [ { "$1": [ { "uno": 0 }, { "dos": 1 }, { "tres": 2 } ] } ] |
Para obtener más información sobre las operaciones con matrices en N1QL, consulte la documentación aquí.
Funciones Array de Couchbase
N1QL dispone de un amplio conjunto de funciones para operar con matrices JSON.
ARRAY_LENGTH devuelve la longitud de una matriz.
cbq> select ARRAY_LENGTH([1, 2, 3, 4, 5]) as res;
1 2 3 4 5 |
"resultados": [ { "res": 5 } ] |
ARRAY_APPEND añade elementos al final de una matriz.
cbq> select ARRAY_APPEND([1, 2, 3, 4, 5], 9, 10) as res;
1 2 3 4 5 6 7 8 9 10 11 12 13 |
"resultados": [ { "res": [ 1, 2, 3, 4, 5, 9, 10 ] } ] |
ARRAY_CONCAT es similar, pero une dos matrices.
cbq> select ARRAY_CONCAT([1, 2, 3, 4, 5], [7, 8]) as res;
1 2 3 4 5 6 7 8 9 10 11 12 13 |
"resultados": [ { "res": [ 1, 2, 3, 4, 5, 7, 8 ] } ] |
ARRAY_SORT ordena los elementos de una matriz.
cbq> select ARRAY_SORT([2, 1, 3, 5, 4]) as res;
1 2 3 4 5 6 7 8 9 10 11 |
"resultados": [ { "res": [ 1, 2, 3, 4, 5 ] } ] |
Por último, ARRAY_DISTINCT elimina los duplicados de una matriz.
cbq> select ARRAY_DISTINCT([1, 2, 3, 3, 4, 5, 4, 5]) as res;
1 2 3 4 5 6 7 8 9 10 11 |
"resultados": [ { "res": [ 5, 1, 4, 2, 3 ] } ] |
Hay muchas más funciones de array útiles en N1QL, demasiadas para cubrirlas aquí. Puedes encontrar la lista completa aquí.
Rendimiento
"¿Pero qué pasa con el rendimiento de las matrices JSON?", te preguntarás. No temas, eso se trata en otro artículo, aquí.