Iniciante4 min de leitura

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:

presentabsentQuery / ScanProcess ItemsLastEvaluatedKey?Set ExclusiveStartKeyDone

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ê.

Atualizado