[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:
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
- 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.
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
Exibições com a função Reduce
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.
DO tutorial
WHERE idade > 30
LIMITE 2
DESLOCAMENTO 2
Se você quiser saber mais sobre o N1QL:
Muitas informações úteis, ótimo!
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?
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.
Olá, como posso obter o totalPage com paginação.