Consultar visualizações é a essência das visualizações. Nossa documentação é excelente e pode ser encontrada aqui: http://www.couchbase.com/docs/couchbase-manual-2.0/couchbase-views.html
Chaves compostas
Apenas para ilustrar como o nível de grupo funciona, vamos usar uma função Map que classifica os usuários pelo último registro de data e hora de login, convertendo esse registro de data e hora em uma matriz [aaaa, MM, dd, hh, mm, ss] no que chamamos de "chave composta" (ou Array Key) como saída da função Map:
Função de mapa
Se (doc.login_timestamp) {
emit(dateToArray(doc.login_timestamp), doc.username);
}
}
Reduzir a função
Linhas resultantes (com 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"
|
A primeira coisa a ser observada e *muito* importante é que, embora essa seja uma saída de matriz que parece ser de inteiros da função Map do javascript, ela não é. Cada uma dessas chaves de índice é uma cadeia de caracteres e é ordenada caractere por caractere como uma cadeia de caracteres, incluindo os colchetes e as vírgulas. É mais ou menos assim, então vamos em frente e manteremos os caracteres de aspas:
[“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"
|
Contraexemplo ilustrativo rápido para ordenação de chaves
Se você tiver a seguinte saída do Map, observe que ela é classificada de forma diferente do que seria se os parâmetros Int fossem realmente Int's; na verdade, as chaves de índice são sempre strings.
[2012, "beer",1]
|
nulo
|
[2012, "beer",10]
|
nulo
|
[2012, "beer",2]
|
nulo
|
Observe que o segundo "elemento" da chave de índice é ordenado antes do terceiro por causa da comparação de strings, que não são números inteiros. De volta ao programa agendado...
Continuando com o Nível de Grupo...
Portanto, agora, voltando à lista de login_timestamps na exibição acima, se quisermos ver quantas pessoas se conectaram durante cada ano, adiciono o parâmetro de consulta "group_level=1" e ele divide a cadeia de caracteres na primeira vírgula e agrupa os elementos à esquerda por correspondência de cadeia de caracteres e, em seguida, reduz no grupo, produzindo a contagem.
[“2011”]
|
1
|
[“2012”]
|
1
|
[“2013”]
|
4
|
Agora, se quisermos ter uma visualização mais detalhada (ano, mês), adicionaremos 1 ao group_level, group_level=2, que se divide na segunda vírgula e pega o elemento da esquerda e o agrupa, seguido pela redução. O resultado é o seguinte com os mesmos dados:
[“2011″,”10”]
|
1
|
[“2012″,”12”]
|
1
|
[“2013″,”01”]
|
3
|
[“2013″,”02”]
|
1
|
Passando para o próximo group_level, group_level=3, agrupará por (yyyyy,MM,dd), que é o terceiro elemento da chave composta, que se divide na terceira vírgula e agrupa o elemento esquerdo e reduz:
[“2011″,”10″,”10”]
|
1
|
[“2012″,”12″,”24”]
|
1
|
[“2013″,”01″,”01”]
|
1
|
[“2013″,”01″,”25”]
|
2
|
[“2013″,”02″,”01”]
|
1
|
Nesse pequeno conjunto de dados, se usarmos group_level=4, que nesse caso é por hora (yyyyy,MM,dd,hh), cada elemento é seu próprio resultado de linha, podendo ser agrupado e reduzido porque são todos exclusivos. Em um conjunto de dados maior e atualizado com mais frequência, você provavelmente poderia agrupar por minuto e ver números de _count mais 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
|
Entendendo as chaves compostas
Como você pode ver, as chaves compostas são muito úteis, mas algum nível de compreensão o ajuda a usá-las corretamente. Lembrar-se de que se trata de uma comparação de cadeia de caracteres o ajudará a evitar a criação de chaves que não serão ordenadas da maneira esperada. Além disso, é bom deixar os números à esquerda com 0 para garantir que eles sejam ordenados corretamente, já que se trata de uma comparação de cadeia de caracteres e não de um "valor" inteiro:
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.year, doc.type, pval], null);
}
}
Linhas resultantes (com reduce=false)
[2012,”beer”,”000000001″]
|
1
|
[2012,”beer”,”000000002″]
|
1
|
[2012,”beer”,”000000010″]
|
1
|
É claro que você pode colocar qualquer coisa na matriz, não apenas dateToArray! Essa é uma tática útil para poder agrupar itens para reduções. O último aspecto a ser lembrado é que, se você preencher com zeros, eles serão strings; portanto, se quiser fazer uma consulta de intervalo na chave de índice resultante, também deverá preencher esse intervalo com zeros se estiver procurando um intervalo específico, por exemplo:
&endkey=[2012,”beer”,”000000007″]
Entendendo a colação Unicode
Para obter mais informações sobre a ordenação de caracteres de cadeia de caracteres, leia minha postagem sobre Unicode Collation in Views, pois ela não está em ordem de bytes e também se aplica a chaves compostas: Entendendo a ordem das letras em consultas de visualização
O que acontece se o grupo for aplicado e a redução não for aplicada? Isso nos dá chaves DISTINCT no nível do grupo?
[...] P: As visualizações são a única maneira de usar chaves compostas? Existe uma maneira de usá-las com chaves get ou setup para usar esse tipo de funcionalidade sem uma visualização? http://www.couchbase.com/understanding-grouplevel-view-queries-compound-keys […]