{"id":1811,"date":"2014-12-16T17:51:04","date_gmt":"2014-12-16T17:51:03","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1811"},"modified":"2025-06-13T21:11:09","modified_gmt":"2025-06-14T04:11:09","slug":"understanding-grouplevel-view-queries-compound-keys","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/understanding-grouplevel-view-queries-compound-keys\/","title":{"rendered":"Compreens\u00e3o de group_level em consultas de visualiza\u00e7\u00e3o com chaves compostas"},"content":{"rendered":"<p><span style=\"font-family: ff-meta-serif-web-pro-1, ff-meta-serif-web-pro-2, Georgia, 'Times New Roman', Times, serif;font-size: 16px;font-style: normal\">Consultar visualiza\u00e7\u00f5es \u00e9 a ess\u00eancia das visualiza\u00e7\u00f5es. Nossa documenta\u00e7\u00e3o \u00e9 excelente e pode ser encontrada aqui:\u00a0<\/span><a style=\"font-style: normal;font-size: 16px;font-family: ff-meta-serif-web-pro-1, ff-meta-serif-web-pro-2, Georgia, 'Times New Roman', Times, serif\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/docs\/couchbase-manual-2.0\/couchbase-views.html\/\">https:\/\/www.couchbase.com\/docs\/couchbase-manual-2.0\/couchbase-views.html<\/a><\/p>\n<h3>Chaves compostas<\/h3>\n<p>Apenas para ilustrar como o n\u00edvel de grupo funciona, vamos usar uma fun\u00e7\u00e3o Map que classifica os usu\u00e1rios pelo \u00faltimo 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\u00edda da fun\u00e7\u00e3o Map:<\/p>\n<h5>Fun\u00e7\u00e3o de mapa<\/h5>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">function(doc, meta) {<br \/>\nSe (doc.login_timestamp) {<br \/>\nemit(dateToArray(doc.login_timestamp), doc.username);<br \/>\n}<br \/>\n}<\/div>\n<\/div>\n<h5>Reduzir a fun\u00e7\u00e3o<\/h5>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">_count<\/div>\n<\/div>\n<h5>Linhas resultantes (com reduce=false)<\/h5>\n<table style=\"width: 400px\" border=\"1\" cellspacing=\"1\" cellpadding=\"1\">\n<tbody>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[2011,10,10,10,10,09]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\"scalabl3\"<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[2012,12,24,17,03,59]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\"scalabl3\"<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[2013,01,01,08,22,23]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\"scalabl3\"<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[2013,01,25,10,38,01]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\"tgrall\"<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[2013,01,25,11,02,32]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\"jzablocki\"<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[2013,02,01,11,02,32]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\"scalabl3\"<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>A primeira coisa a ser observada e *muito* importante \u00e9 que, embora essa seja uma sa\u00edda de matriz que parece ser de inteiros da fun\u00e7\u00e3o Map do javascript, ela n\u00e3o \u00e9. Cada uma dessas chaves de \u00edndice \u00e9 uma cadeia de caracteres e \u00e9 ordenada caractere por caractere como uma cadeia de caracteres, incluindo os colchetes e as v\u00edrgulas. \u00c9 mais ou menos assim, ent\u00e3o vamos em frente e manteremos os caracteres de aspas:<\/p>\n<table style=\"width: 400px\" border=\"1\" cellspacing=\"1\" cellpadding=\"1\">\n<tbody>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2011&#8243;,&#8221;10&#8243;,&#8221;10&#8243;,&#8221;10&#8243;,&#8221;10&#8243;,&#8221;09&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\"scalabl3\"<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2012&#8243;,&#8221;12&#8243;,&#8221;24&#8243;,&#8221;17&#8243;,&#8221;03&#8243;,&#8221;59&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\"scalabl3\"<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2013&#8243;,&#8221;01&#8243;,&#8221;01&#8243;,&#8221;08&#8243;,&#8221;22&#8243;,&#8221;23&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\"scalabl3\"<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2013&#8243;,&#8221;01&#8243;,&#8221;25&#8243;,&#8221;10&#8243;,&#8221;38&#8243;,&#8221;01&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\"tgrall\"<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2013&#8243;,&#8221;01&#8243;,&#8221;25&#8243;,&#8221;11&#8243;,&#8221;02&#8243;,&#8221;32&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\"jzablocki\"<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2013&#8243;,&#8221;02&#8243;,&#8221;01&#8243;,&#8221;11&#8243;,&#8221;02&#8243;,&#8221;32&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\"scalabl3\"<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Contraexemplo ilustrativo r\u00e1pido para ordena\u00e7\u00e3o de chaves<\/h3>\n<p>Se voc\u00ea tiver a seguinte sa\u00edda do Map, observe que ela \u00e9 classificada de forma diferente do que seria se os par\u00e2metros Int fossem realmente Int's; na verdade, as chaves de \u00edndice s\u00e3o sempre strings.<\/p>\n<table style=\"width: 400px\" border=\"1\" cellspacing=\"1\" cellpadding=\"1\">\n<tbody>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[2012, \"beer\",1]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">nulo<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[2012, \"beer\",10]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">nulo<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[2012, \"beer\",2]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">nulo<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Observe que o segundo \"elemento\" da chave de \u00edndice \u00e9 ordenado antes do terceiro por causa da compara\u00e7\u00e3o de strings, que n\u00e3o s\u00e3o n\u00fameros inteiros. De volta ao programa agendado...<\/p>\n<h3>Continuando com o N\u00edvel de Grupo...<\/h3>\n<p>Portanto, agora, voltando \u00e0 lista de login_timestamps na exibi\u00e7\u00e3o acima, se quisermos ver quantas pessoas se conectaram durante cada ano, adiciono o par\u00e2metro de consulta \"group_level=1\" e ele divide a cadeia de caracteres na primeira v\u00edrgula e agrupa os elementos \u00e0 esquerda por correspond\u00eancia de cadeia de caracteres e, em seguida, reduz no grupo, produzindo a contagem.<\/p>\n<table style=\"width: 400px\" border=\"1\" cellspacing=\"1\" cellpadding=\"1\">\n<tbody>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2011&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">1<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2012&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">1<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2013&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">4<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Agora, se quisermos ter uma visualiza\u00e7\u00e3o mais detalhada (ano, m\u00eas), adicionaremos 1 ao group_level, group_level=2, que se divide na segunda v\u00edrgula e pega o elemento da esquerda e o agrupa, seguido pela redu\u00e7\u00e3o. O resultado \u00e9 o seguinte com os mesmos dados:<\/p>\n<table style=\"width: 400px\" border=\"1\" cellspacing=\"1\" cellpadding=\"1\">\n<tbody>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2011&#8243;,&#8221;10&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">1<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2012&#8243;,&#8221;12&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">1<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2013&#8243;,&#8221;01&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">3<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2013&#8243;,&#8221;02&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">1<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Passando para o pr\u00f3ximo group_level, group_level=3, agrupar\u00e1 por (yyyyy,MM,dd), que \u00e9 o terceiro elemento da chave composta, que se divide na terceira v\u00edrgula e agrupa o elemento esquerdo e reduz:<\/p>\n<table style=\"width: 400px\" border=\"1\" cellspacing=\"1\" cellpadding=\"1\">\n<tbody>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2011&#8243;,&#8221;10&#8243;,&#8221;10&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">1<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2012&#8243;,&#8221;12&#8243;,&#8221;24&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">1<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2013&#8243;,&#8221;01&#8243;,&#8221;01&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">1<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2013&#8243;,&#8221;01&#8243;,&#8221;25&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">2<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2013&#8243;,&#8221;02&#8243;,&#8221;01&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">1<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Nesse pequeno conjunto de dados, se usarmos group_level=4, que nesse caso \u00e9 por hora (yyyyy,MM,dd,hh), cada elemento \u00e9 seu pr\u00f3prio resultado de linha, podendo ser agrupado e reduzido porque s\u00e3o todos exclusivos. Em um conjunto de dados maior e atualizado com mais frequ\u00eancia, voc\u00ea provavelmente poderia agrupar por minuto e ver n\u00fameros de _count mais altos:<\/p>\n<table style=\"width: 400px\" border=\"1\" cellspacing=\"1\" cellpadding=\"1\">\n<tbody>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2011&#8243;,&#8221;10&#8243;,&#8221;10&#8243;,&#8221;10&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">1<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2012&#8243;,&#8221;12&#8243;,&#8221;24&#8243;,&#8221;17&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">1<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2013&#8243;,&#8221;01&#8243;,&#8221;01&#8243;,&#8221;08&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">1<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2013&#8243;,&#8221;01&#8243;,&#8221;25&#8243;,&#8221;10&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">1<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2013&#8243;,&#8221;01&#8243;,&#8221;25&#8243;,&#8221;11&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">1<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[&#8220;2013&#8243;,&#8221;02&#8243;,&#8221;01&#8243;,&#8221;11&#8221;]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">1<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Entendendo as chaves compostas<\/h3>\n<p>Como voc\u00ea pode ver, as chaves compostas s\u00e3o muito \u00fateis, mas algum n\u00edvel de compreens\u00e3o o ajuda a us\u00e1-las corretamente. Lembrar-se de que se trata de uma compara\u00e7\u00e3o de cadeia de caracteres o ajudar\u00e1 a evitar a cria\u00e7\u00e3o de chaves que n\u00e3o ser\u00e3o ordenadas da maneira esperada. Al\u00e9m disso, \u00e9 bom deixar os n\u00fameros \u00e0 esquerda com 0 para garantir que eles sejam ordenados corretamente, j\u00e1 que se trata de uma compara\u00e7\u00e3o de cadeia de caracteres e n\u00e3o de um \"valor\" inteiro:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">function (doc, meta) {<br \/>\nif (doc.year &amp;&amp; doc.type == \"beer\" &amp;&amp; doc.int_value) {<br \/>\nvar val = doc.int_value.toString();<br \/>\nvar max =\"000000000\u2033;<br \/>\nvar pval = max.substring(0, max.length - val.length) + val;<br \/>\nemit([doc.year, doc.type, pval], null);<br \/>\n}<br \/>\n}<\/div>\n<\/div>\n<h5>Linhas resultantes (com reduce=false)<\/h5>\n<table style=\"width: 400px\" border=\"1\" cellspacing=\"1\" cellpadding=\"1\">\n<tbody>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[2012,\u201dbeer\u201d,\u201d000000001\u2033]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">1<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[2012,\u201dbeer\u201d,\u201d000000002\u2033]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">1<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[2012,\u201dbeer\u201d,\u201d000000010\u2033]<\/div>\n<\/div>\n<\/td>\n<td>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">1<\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u00c9 claro que voc\u00ea pode colocar qualquer coisa na matriz, n\u00e3o apenas dateToArray! Essa \u00e9 uma t\u00e1tica \u00fatil para poder agrupar itens para redu\u00e7\u00f5es. O \u00faltimo aspecto a ser lembrado \u00e9 que, se voc\u00ea preencher com zeros, eles ser\u00e3o strings; portanto, se quiser fazer uma consulta de intervalo na chave de \u00edndice resultante, tamb\u00e9m dever\u00e1 preencher esse intervalo com zeros se estiver procurando um intervalo espec\u00edfico, por exemplo:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">startkey=[2012,\u201dbeer\u201d,\u201d000000002\u2033]<br \/>\n&amp;endkey=[2012,\u201dbeer\u201d,\u201d000000007\u2033]<\/div>\n<\/div>\n<h3>Entendendo a cola\u00e7\u00e3o Unicode<\/h3>\n<p>Para obter mais informa\u00e7\u00f5es sobre a ordena\u00e7\u00e3o de caracteres de cadeia de caracteres, leia minha postagem sobre Unicode Collation in Views, pois ela n\u00e3o est\u00e1 em ordem de bytes e tamb\u00e9m se aplica a chaves compostas: <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/understanding-letter-ordering-view-queries\/\">Entendendo a ordem das letras em consultas de visualiza\u00e7\u00e3o<\/a><\/p>\n<p><a href=\"https:\/\/twitter.com\/scalabl3\" target=\"_blank\" rel=\"noopener noreferrer\">@scalabl3<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Querying Views is what views are all about. Our documentation is great and can be found here:\u00a0https:\/\/www.couchbase.com\/docs\/couchbase-manual-2.0\/couchbase-views.html Compound Keys Just to illustrate how group level works, let&#8217;s use a Map function that sorts users by the latest login timestamp, converting [&hellip;]<\/p>","protected":false},"author":2,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[9407,1812,2201],"tags":[1241],"ppma_author":[8968],"class_list":["post-1811","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ruby","category-n1ql-query","category-tools-sdks","tag-views"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.4 (Yoast SEO v26.4) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Undertsnading compound keys - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/understanding-grouplevel-view-queries-compound-keys\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Understanding group_level in View Queries with Compound Keys\" \/>\n<meta property=\"og:description\" content=\"Querying Views is what views are all about. Our documentation is great and can be found here:\u00a0https:\/\/www.couchbase.com\/docs\/couchbase-manual-2.0\/couchbase-views.html Compound Keys Just to illustrate how group level works, let&#8217;s use a Map function that sorts users by the latest login timestamp, converting [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/understanding-grouplevel-view-queries-compound-keys\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-12-16T17:51:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T04:11:09+00:00\" \/>\n<meta name=\"author\" content=\"The Couchbase Team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"The Couchbase Team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/\"},\"author\":{\"name\":\"The Couchbase Team\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/764f4a6771ee19bc7af70b70a326fb93\"},\"headline\":\"Understanding group_level in View Queries with Compound Keys\",\"datePublished\":\"2014-12-16T17:51:03+00:00\",\"dateModified\":\"2025-06-14T04:11:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/\"},\"wordCount\":726,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"views\"],\"articleSection\":[\"Ruby\",\"SQL++ \/ N1QL Query\",\"Tools &amp; SDKs\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/\",\"name\":\"Undertsnading compound keys - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2014-12-16T17:51:03+00:00\",\"dateModified\":\"2025-06-14T04:11:09+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Understanding group_level in View Queries with Compound Keys\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/764f4a6771ee19bc7af70b70a326fb93\",\"name\":\"The Couchbase Team\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/7befc37d02226b59499817eafdec60c3\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b4c18c758421903398e84d6c9560f319f39c665798d7d23e6a6f9dff8a8f984e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b4c18c758421903398e84d6c9560f319f39c665798d7d23e6a6f9dff8a8f984e?s=96&d=mm&r=g\",\"caption\":\"The Couchbase Team\"},\"description\":\"Jennifer Garcia is a Senior Web Manager at Couchbase Inc. As the website manager, Jennifer has overall responsibility for the website properties including design, implementation, content, and performance.\",\"sameAs\":[\"https:\/\/www.couchbase.com\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/jennifer-garcia\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Undertsnading compound keys - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/understanding-grouplevel-view-queries-compound-keys\/","og_locale":"pt_BR","og_type":"article","og_title":"Understanding group_level in View Queries with Compound Keys","og_description":"Querying Views is what views are all about. Our documentation is great and can be found here:\u00a0https:\/\/www.couchbase.com\/docs\/couchbase-manual-2.0\/couchbase-views.html Compound Keys Just to illustrate how group level works, let&#8217;s use a Map function that sorts users by the latest login timestamp, converting [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/understanding-grouplevel-view-queries-compound-keys\/","og_site_name":"The Couchbase Blog","article_published_time":"2014-12-16T17:51:03+00:00","article_modified_time":"2025-06-14T04:11:09+00:00","author":"The Couchbase Team","twitter_card":"summary_large_image","twitter_misc":{"Written by":"The Couchbase Team","Est. reading time":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/"},"author":{"name":"The Couchbase Team","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/764f4a6771ee19bc7af70b70a326fb93"},"headline":"Understanding group_level in View Queries with Compound Keys","datePublished":"2014-12-16T17:51:03+00:00","dateModified":"2025-06-14T04:11:09+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/"},"wordCount":726,"commentCount":2,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["views"],"articleSection":["Ruby","SQL++ \/ N1QL Query","Tools &amp; SDKs"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/","url":"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/","name":"Undertsnading compound keys - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2014-12-16T17:51:03+00:00","dateModified":"2025-06-14T04:11:09+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/understanding-grouplevel-view-queries-compound-keys\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Understanding group_level in View Queries with Compound Keys"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/764f4a6771ee19bc7af70b70a326fb93","name":"A equipe do Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/7befc37d02226b59499817eafdec60c3","url":"https:\/\/secure.gravatar.com\/avatar\/b4c18c758421903398e84d6c9560f319f39c665798d7d23e6a6f9dff8a8f984e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b4c18c758421903398e84d6c9560f319f39c665798d7d23e6a6f9dff8a8f984e?s=96&d=mm&r=g","caption":"The Couchbase Team"},"description":"Jennifer Garcia \u00e9 gerente s\u00eanior de Web na Couchbase Inc. Como gerente do site, Jennifer tem a responsabilidade geral pelas propriedades do site, incluindo design, implementa\u00e7\u00e3o, conte\u00fado e desempenho.","sameAs":["https:\/\/www.couchbase.com"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/jennifer-garcia\/"}]}},"authors":[{"term_id":8968,"user_id":2,"is_guest":0,"slug":"jennifer-garcia","display_name":"The Couchbase Team","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/b4c18c758421903398e84d6c9560f319f39c665798d7d23e6a6f9dff8a8f984e?s=96&d=mm&r=g","author_category":"","last_name":"Garcia","first_name":"Jennifer","job_title":"","user_url":"https:\/\/www.couchbase.com","description":"Jennifer Garcia \u00e9 gerente s\u00eanior de Web na Couchbase Inc. Como gerente do site, Jennifer tem a responsabilidade geral pelas propriedades do site, incluindo design, implementa\u00e7\u00e3o, conte\u00fado e desempenho."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1811","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=1811"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1811\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=1811"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1811"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1811"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=1811"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}