Ruby

Comprensión de group_level en consultas de vista con claves compuestas

Consultar vistas es de lo que tratan las vistas. Nuestra documentación es excelente y se puede encontrar aquí: http://www.couchbase.com/docs/couchbase-manual-2.0/couchbase-views.html

Teclas compuestas

Para ilustrar cómo funciona el nivel de grupo, utilicemos una función de mapa que ordene los usuarios por la última marca de tiempo de inicio de sesión, convirtiendo esa marca de tiempo en una matriz [aaaa,MM,dd,hh,mm,ss] en lo que llamamos una "clave compuesta" (o clave de matriz) como salida de la función de mapa:

Función de mapa
function(doc, meta) {
if (doc.login_timestamp) {
emit(dateToArray(doc.login_timestamp), doc.nombre_usuario);
}
}
Reducir la función
Cuenta
Filas resultantes (con reduce=false)
[2011,10,10,10,10,09]
"scalabl3"
[2012,12,24,17,03,59]
"scalabl3"
[2013,01,01,08,22,23]
"scalabl3"
[2013,01,25,10,38,01]
"tgrall"
[2013,01,25,11,02,32]
"jzablocki"
[2013,02,01,11,02,32]
"scalabl3"

Lo primero a destacar y *muy* importante, aunque esta es una salida de array que parecen enteros de la función Map de javascript, no lo son, cada una de esas Claves Índice son cadenas, y están ordenadas carácter a carácter como cadenas, incluyendo los corchetes y las comas, fíjate que todos los dígitos simples están rellenados con ceros delante, y por eso se mantiene el orden. Es más como esto, así que vamos a seguir adelante y mantener los caracteres de comillas:

[“2011″,”10″,”10″,”10″,”10″,”09”]
"scalabl3"
[“2012″,”12″,”24″,”17″,”03″,”59”]
"scalabl3"
[“2013″,”01″,”01″,”08″,”22″,”23”]
"scalabl3"
[“2013″,”01″,”25″,”10″,”38″,”01”]
"tgrall"
[“2013″,”01″,”25″,”11″,”02″,”32”]
"jzablocki"
[“2013″,”02″,”01″,”11″,”02″,”32”]
"scalabl3"

Contraejemplo ilustrativo rápido de ordenación de claves

Si tuviera la siguiente salida de Map, observe que está ordenada de forma diferente a como lo estaría si los parámetros Int fueran realmente Int's, de hecho las Claves de Índice son siempre cadenas.

[2012, "cerveza",1]
null
[2012, "cerveza",10]
null
[2012, "cerveza",2]
null

Observe que el segundo "elemento" de la clave de índice se ordena para que esté antes que el tercero debido a la comparación de cadenas, éstas no son enteras. De vuelta al programa programado...

Continuando con el Nivel de Grupo...

Así que ahora, volviendo a la lista de login_timestamps en la vista anterior, si queremos ver cuántas personas se conectaron durante cada año, añado el parámetro de consulta "group_level=1" y divide la cadena en la primera coma y agrupa los elementos de la izquierda por coincidencia de cadena, y luego reduce en el grupo, produciendo el recuento.

[“2011”]
1
[“2012”]
1
[“2013”]
4

Ahora, si queremos tener una vista de grano más fino (año, mes), añadimos 1 al group_level, group_level=2, que se divide en la segunda coma y toma el elemento de la izquierda y los agrupa, seguido de la reducción. Esto resulta en lo siguiente con los mismos datos:

[“2011″,”10”]
1
[“2012″,”12”]
1
[“2013″,”01”]
3
[“2013″,”02”]
1

Pasando al siguiente group_level, group_level=3, agrupará por (aaaa,MM,dd), que es el tercer elemento de la clave compuesta, esto divide en la 3ª coma, y agrupa el elemento de la izquierda y reduce:

[“2011″,”10″,”10”]
1
[“2012″,”12″,”24”]
1
[“2013″,”01″,”01”]
1
[“2013″,”01″,”25”]
2
[“2013″,”02″,”01”]
1

En este minúsculo conjunto de datos, si vamos a group_level=4, que en este caso es por hora (aaaa,MM,dd,hh), cada elemento es su propio resultado de fila, pudiendo agruparse y reducirse porque todos son únicos. En un conjunto de datos más grande y actualizado con más frecuencia probablemente se podría agrupar por minutos y ver números _count más altos:

[“2011″,”10″,”10″,”10”]
1
[“2012″,”12″,”24″,”17”]
1
[“2013″,”01″,”01″,”08”]
1
[“2013″,”01″,”25″,”10”]
1
[“2013″,”01″,”25″,”11”]
1
[“2013″,”02″,”01″,”11”]
1

Claves compuestas

Como puede ver, las claves compuestas son muy útiles, pero un cierto nivel de comprensión le ayudará a utilizarlas correctamente. Recordar que se trata de una comparación de cadenas te ayudará a evitar crear claves que no se ordenen como esperas. Además es bueno rellenar los números a la izquierda con 0's para asegurar que se ordenen correctamente ya que es una comparación por cadena y no por "valor" entero:

function (doc, meta) {
if (doc.year && doc.type == "beer" && doc.int_value) {
var val = doc.int_value.toString();
var max ="000000000″;
var pval = max.substring(0, max.length - val.length) + val;
emit([doc.año, doc.tipo, pval], null);
}
}
Filas resultantes (con reduce=false)
[2012,”beer”,”000000001″]
1
[2012,”beer”,”000000002″]
1
[2012,”beer”,”000000010″]
1

Por supuesto, puedes poner cualquier cosa en el array, ¡no sólo dateToArray! Es una táctica útil para poder agrupar elementos para reducciones. Por último, recuerde que si rellena con ceros, se trata de cadenas, por lo que si desea realizar una consulta de rango en la clave de índice resultante, también deberá rellenar ese rango con ceros si está buscando un rango específico, por ejemplo:

startkey=[2012,”beer”,”000000002″]
&endkey=[2012,”beer”,”000000007″]

Comprender la intercalación Unicode

Para obtener más información sobre el orden de los caracteres de cadena, por favor lea mi post sobre Unicode Collation in Views, ya que no está en orden de bytes y se aplica a las claves compuestas también: Comprender el orden de las letras en las consultas de vista

@scalabl3

Comparte este artículo
Recibe actualizaciones del blog de Couchbase en tu bandeja de entrada
Este campo es obligatorio.

Autor

Publicado por El equipo de Couchbase

Jennifer Garcia es Gerente Senior de Web en Couchbase Inc. Como responsable del sitio web, Jennifer tiene la responsabilidad general de las propiedades del sitio web, incluido el diseño, la implementación, el contenido y el rendimiento.

2 Comentarios

  1. Alireza Alidoost junio 4, 2015 a 6:39 pm

    ¿ Qué pasa si se aplica el grupo y no se aplica la reducción ? ¿ Nos da esto claves DISTINTAS a nivel de grupo ?

  2. [...] P: ¿Son las vistas la única forma de utilizar las teclas compuestas? ¿Existe alguna forma de utilizarlas con claves get o setup para utilizar este tipo de funcionalidad sin una vista http://www.couchbase.com/understanding-grouplevel-view-queries-compound-keys  […]

Deja un comentario

¿Listo para empezar con Couchbase Capella?

Empezar a construir

Consulte nuestro portal para desarrolladores para explorar NoSQL, buscar recursos y empezar con tutoriales.

Utilizar Capella gratis

Ponte manos a la obra con Couchbase en unos pocos clics. Capella DBaaS es la forma más fácil y rápida de empezar.

Póngase en contacto

¿Quieres saber más sobre las ofertas de Couchbase? Permítanos ayudarle.