[Este blog foi distribuído pelo site http://blog.grallandco.com].

Se você tiver que lidar com um grande número de documentos ao fazer consultas em um cluster do Couchbase, é importante usar a paginação para obter linhas por página. Você pode encontrar algumas informações na documentação no capítulo "Paginação", mas quero dar mais detalhes e exemplos de código neste artigo.
Para este exemplo de paginação, começarei criando uma exibição simples com base no amostra de cerveja a visualização é usada para localizar cervejarias por país:

function (doc, meta) {
Se (doc.type == "brewery" && doc.country){
emit(doc.country);
}
}

 

Essa visualização lista todas as cervejarias por país, o índice é semelhante:

ID do documento Chave Valor
bersaglier Argentina nulo
cervecera_jerome Argentina nulo
fábrica_nacional_balashi Aruba nulo
australian_brewing_corporation Austrália nulo
cervejarias carlton_e_united Austrália nulo
cervejaria coopers Austrália nulo
foster_s_australia_ltd Austrália nulo
cervejaria gold_coast Austrália nulo
lion_nathan_australia_hunter_street Austrália nulo
cervejaria little_creatures Austrália nulo
malt_shovel_brewery Austrália nulo
matilda_bay_brewing Austrália nulo
cervejaria yellowstone_valley Estados Unidos nulo
yuengling_son_brewing Estados Unidos nulo
zea_rotisserie_and_brewery Estados Unidos nulo
fosters_tien_gang Vietnã nulo
cervejaria hue_brewery Vietnã nulo

Portanto, agora você deseja navegar nesse índice com um tamanho de página de 5 linhas.

Uso de parâmetros de salto/limite

A abordagem mais simplista é usar limite e pular parâmetros, por exemplo:

Página 1 :  ?limit=5&skip0
Página 2:   ?limit=5&skip=5

Página x:   ?limit=5&skip(limit*(page-1))

Obviamente, você pode usar quaisquer outros parâmetros necessários para fazer consultas de intervalo ou chave (tecla inicial/tecla final, tecla, teclas) e a opção de classificação (descendente).

Essa é uma maneira simples, mas não a mais eficiente, pois o mecanismo de consulta precisa ler todas as linhas que correspondem à consulta, até que o valor de salto seja atingido.

Alguns exemplos de código em python que paginam usando essa exibição:

Esse aplicativo faz um loop em todas as páginas até o final do índice.

Como eu disse antes, isso não representa as práticas recomendadas de paginação, pois o sistema deve ler todos os valores até que o salto seja alcançado. O exemplo a seguir mostra uma maneira melhor de lidar com isso.

Uso dos parâmetros startkey / startkey_docid

Para tornar essa paginação mais eficiente, é possível adotar outra abordagem. Essa abordagem usa o tecla de início e startkey_docid  para selecionar os documentos adequados.
  • O tecla de início será o valor da chave em que a consulta deve começar a ler (com base na última chave da "página anterior")
  • Como para uma chave, por exemplo, "Alemanha", você pode ter um ou mais ids (documentos), é necessário dizer ao mecanismo de consulta do Couchbase por onde começar; para isso, você precisa usar o startkey_docid e ignorar esse ID, pois ele é o último da página anterior.
Portanto, se olharmos para o índice e adicionarmos um número de linha para explicar a paginação
Número da linha ID do documento Chave Valor
Consulta para a página 1 : ?limit=5
1 bersaglier Argentina nulo
2 cervecera_jerome Argentina nulo
3 fábrica_nacional_balashi Aruba nulo
4 australian_brewing_corporation Austrália nulo
5 cervejarias carlton_e_united Austrália nulo
Consulta para a página 2: ?limit=5&startkey="Australia"&startkey_docid=carlton_and_united_breweries&skip=1
6 cervejaria coopers Austrália nulo
7 foster_s_australia_ltd Austrália nulo
8 cervejaria gold_coast Austrália nulo
9 lion_nathan_australia_hunter_street Austrália nulo
10 cervejaria little_creatures Austrália nulo
Consulta para a página 3 : limit=5&startkey="Australia"&startkey_docid=little_creatures_brewery&skip=1
11 malt_shovel_brewery Austrália nulo
12 matilda_bay_brewing Austrália nulo
cervejaria yellowstone_valley Estados Unidos nulo
yuengling_son_brewing Estados Unidos nulo
zea_rotisserie_and_brewery Estados Unidos nulo
fosters_tien_gang Vietnã nulo
cervejaria hue_brewery Vietnã nulo

Portanto, como você pode ver nos exemplos acima, a consulta usa a startkey, um ID de documento, e simplesmente o passa usando skip=1.

Vejamos agora o código do aplicativo, mais uma vez em Python

 

Esse aplicativo faz um loop em todas as páginas até o final do índice
Usando essa abordagem, o aplicativo começa a ler o índice em uma chave específica (tecla de início ), e apenas o loop na entrada necessária no índice. Isso é mais eficiente do que usar a abordagem simples de pular.

 

Exibições com a função Reduce

Quando a visualização estiver usando uma função de redução, se você quiser paginar apenas nas várias teclas (com a função de redução), será necessário usar o pular e limite parâmetros.
Quando você estiver usando o  parâmetro startkey_docid com uma função de redução, ele calculará a redução somente para o subconjunto de IDs de documentos que fazem parte de sua consulta.

Paginador do SDK Java do Couchbase

Nos exemplos anteriores, mostrei como fazer a paginação usando os vários parâmetros de consulta. O Java SDK fornece um objeto Paginator para ajudar os desenvolvedores a lidar com a paginação. O exemplo a seguir está usando a mesma visualização com a API Paginator.

Portanto, como você pode ver, é possível paginar facilmente os resultados de uma consulta usando o Java Paginator.

  • Na linha #37, o Paginator é criado usando os objetos de visualização e consulta e um tamanho de página é especificado
  • Depois, basta usar os métodos hasNext() e next() para navegar pelos resultados.

O Java Paginator está ciente do fato de que a consulta está usando uma redução ou não, portanto, você pode usá-lo com todos os tipos de consultas - internamente, ele alternará entre a abordagem de pular/limitar e as abordagens doc_id. Você pode Veja como isso é feito na classe Paginator.

Observe que, se você quiser fazer isso em um aplicativo da Web entre solicitações HTTP, deverá manter o objeto Paginator na sessão do usuário, pois a API atual mantém a página atual em seu estado.

Conclusão

Nesta postagem do blog, você aprendeu a lidar com a paginação nas exibições do Couchbase; para resumir

  • A paginação é baseada em alguns parâmetros específicos que você envia ao executar uma consulta.
  • Os desenvolvedores de Java podem usar a classe Paginator, que simplifica a paginação.
Convido-o a dar uma olhada na nova linguagem de consulta N1QL do Couchbase, ainda em desenvolvimento, que fornecerá mais opções de paginação aos desenvolvedores, usando os parâmetros LIMIT e OFFSET, por exemplo:
SELECT fname, age
DO tutorial
WHERE idade > 30
LIMITE 2
DESLOCAMENTO 2

Se você quiser saber mais sobre o N1QL:

PS: Editado em 8 de outubro para esclarecer a função Paginação com redução

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.

4 Comentários

  1. Muitas informações úteis, ótimo!

  2. Uma coisa que notei sobre as páginas (e que o seu artigo menciona) é que o tempo para recuperar a página X é proporcional à distância de X em relação a 0. Por exemplo, se eu tiver 100.000 linhas e minhas páginas tiverem 1.000 cada uma (o que me dá 100 páginas), e eu recuperar a página 100, levará o mesmo tempo que recuperar todas as 100.000. Você tem uma solução relativamente elaborada para a simplicidade da tarefa - talvez essa seja uma funcionalidade que possa ser incorporada à lógica da página de exibição por padrão?

  3. E se as chaves do viewQuery (=startKey) forem ÚNICAS entre si, então acho que não há necessidade de usar startkey_docid. Estou certo?
    E mais... startkey_docid é independente da chave de consulta da visualização, portanto, parece que pode custar um pouco para descobrir o ponto de partida por start_key_docid, a partir do índice ordenado de visualização quiery - é preciso fazer a varredura do ponto de partida até encontrar o docid.

  4. Olá, como posso obter o totalPage com paginação.

Deixar uma resposta