Compreensão de group_level em consultas de visualização com chaves compostas

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
function(doc, meta) {
Se (doc.login_timestamp) {
emit(dateToArray(doc.login_timestamp), doc.username);
}
}
Reduzir a função
_count
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:

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.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:

startkey=[2012,”beer”,”000000002″]
&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

@scalabl3

Compartilhe este artigo
Receba atualizações do blog do Couchbase em sua caixa de entrada
Esse campo é obrigatório.

Autor

Postado por A equipe do Couchbase

Jennifer Garcia é gerente sênior de Web na Couchbase Inc. Como gerente do site, Jennifer tem a responsabilidade geral pelas propriedades do site, incluindo design, implementação, conteúdo e desempenho.

2 Comentários

  1. Alireza Alidoost junho 4, 2015 em 6:39 pm

    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?

  2. [...] 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  […]

Deixe um comentário

Pronto para começar a usar o Couchbase Capella?

Iniciar a construção

Confira nosso portal do desenvolvedor para explorar o NoSQL, procurar recursos e começar a usar os tutoriais.

Use o Capella gratuitamente

Comece a trabalhar com o Couchbase em apenas alguns cliques. O Capella DBaaS é a maneira mais fácil e rápida de começar.

Entre em contato

Deseja saber mais sobre as ofertas do Couchbase? Deixe-nos ajudar.