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
if (doc.login_timestamp) {
emit(dateToArray(doc.login_timestamp), doc.nombre_usuario);
}
}
Reducir la función
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:
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:
&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
¿ Qué pasa si se aplica el grupo y no se aplica la reducción ? ¿ Nos da esto claves DISTINTAS a nivel de grupo ?
[...] 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 […]