Iniciante4 min de leitura

Paginação no DynamoDB

O DynamoDB nunca retorna "todos" os resultados em uma única chamada. Um Query ou Scan retorna no máximo 1 MB de dados, depois entrega a você uma LastEvaluatedKey para retomar dali. Fazer a paginação certa significa iterar sobre essa chave — não sobre um contador.

Como funciona a paginação no DynamoDB?

Um Query ou Scan retorna no máximo 1 MB por chamada, depois devolve uma LastEvaluatedKey. Para paginar, você passa essa chave como a ExclusiveStartKey da próxima chamada e itera até o DynamoDB não retornar mais nenhuma chave. Não há números de página, não há contagem total, e o Limit limita os itens avaliados — não os itens retornados.

let key;
do {
  const out = await client.send(new QueryCommand({...params, ExclusiveStartKey: key}));
  process(out.Items);
  key = out.LastEvaluatedKey;
} while (key);

Quando a LastEvaluatedKey é undefined, você chegou ao fim. Passe-a de volta como ExclusiveStartKey para buscar a próxima fatia.

O controle de fluxo é um único loop que só termina com uma chave ausente:

presenteausenteQuery / ScanProcessa ItemsLastEvaluatedKey?Define ExclusiveStartKeyConcluído

Cada passagem ou retoma a partir da chave retornada ou para — não há contador.

Limit não é um tamanho de página

O Limit limita quantos itens o DynamoDB avalia, não quantos ele retorna depois de uma FilterExpression. Uma consulta com Limit: 25 atrás de um filtro pode retornar 3 itens e ainda assim entregar uma LastEvaluatedKey — você precisa continuar paginando até a chave estar vazia, mesmo quando uma página parece curta. Uma LastEvaluatedKey não vazia também nunca promete mais itens correspondentes; só uma chave ausente prova que você chegou ao fim.

Deixe o SDK paginar

Ambos os SDKs envolvem o loop acima para que você possa iterar sobre as páginas diretamente:

// AWS SDK for JavaScript v3
import {paginateQuery} from '@aws-sdk/lib-dynamodb';
for await (const page of paginateQuery({client}, params)) {
  process(page.Items);
}
# boto3
paginator = client.get_paginator('query')
for page in paginator.paginate(**params):
    process(page['Items'])

Sem números de página

O DynamoDB não tem contagem total nem acesso aleatório a páginas — você não pode pular para a "página 7" nem voltar sem replayar os cursores. Projete UIs em torno de scroll infinito / "carregar mais", não de páginas numeradas. (Uma consulta Select: 'COUNT' ainda lê — e cobra por — cada item correspondente para contá-los.)

Cursores stateless para APIs

A LastEvaluatedKey são apenas os atributos de chave do último item. Codifique-a em base64 e entregue-a aos clientes como um nextToken opaco; decodifique-a de volta para ExclusiveStartKey na próxima requisição. Sem estado de cursor no servidor.

Esse token é DynamoDB-JSON — inspecione ou crie um à mão com o conversor de DynamoDB-JSON. E se você está paginando para contornar um Scan, isso geralmente é um sinal para adicionar um índice.

Para pular a escrita do laço por completo, o construtor de consultas compõe a solicitação Query/Scan completa e emite um programa executável para SDK v3, CLI ou boto3 — laço de paginação incluído.

Experimente o DynoTable para paginar pelos resultados de consulta visualmente, com o cursor rastreado por você.

Atualizado