Paginação no DynamoDB
O DynamoDB nunca retorna "todos" os resultados em uma só chamada. Um Query ou Scan retorna no
máximo 1 MB de dados e então te entrega um LastEvaluatedKey de onde retomar. Acertar a
paginação significa iterar sobre essa chave — não sobre um contador.
O laço
let key;
do {
const out = await client.send(new QueryCommand({...params, ExclusiveStartKey: key}));
process(out.Items);
key = out.LastEvaluatedKey;
} while (key);Quando LastEvaluatedKey é undefined, você chegou ao fim. Passe-a de volta como
ExclusiveStartKey para buscar a próxima fatia.
O fluxo de controle é um único laço que só termina com uma chave ausente:
Cada passagem ou retoma a partir da chave retornada ou para — não há contador.
Limit não é um tamanho de página
Limit limita quantos itens o DynamoDB avalia, não quantos ele retorna depois de
um FilterExpression. Uma Query com Limit: 25 por trás de um filtro pode retornar 3 itens e
ainda te entregar um LastEvaluatedKey — você precisa continuar paginando até a chave ficar vazia,
mesmo quando uma página parece curta. Um LastEvaluatedKey não vazio também nunca promete
mais itens correspondentes; só uma chave ausente prova que você chegou ao fim.
Deixe o SDK paginar
Os dois SDKs encapsulam o laço acima para que você itere 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 páginas sem reproduzir os cursores. Projete interfaces em torno de
rolagem infinita / "carregar mais", não de páginas numeradas. (Uma Query Select: 'COUNT'
ainda lê — e cobra por — cada item correspondente para contá-los.)
Cursores sem estado para APIs
LastEvaluatedKey são apenas os atributos de chave do último item. Codifique-o em base64
e entregue-o aos clientes como um nextToken opaco; decodifique-o de volta para
ExclusiveStartKey na próxima requisição. Sem estado de cursor no servidor.
Esse token é DynamoDB-JSON — examine ou monte um à mão com o conversor de DynamoDB-JSON. E se você está paginando para contornar um Scan, isso geralmente é um sinal de que é melhor adicionar um índice.
Experimente o DynoTable para paginar pelos resultados de uma Query visualmente, com o cursor controlado para você.