Principiante4 min di lettura

Paginazione in DynamoDB

DynamoDB non restituisce mai "tutti" i risultati in una sola chiamata. Una Query o uno Scan restituisce al massimo 1 MB di dati, poi ti consegna un LastEvaluatedKey da cui riprendere. Fare la paginazione correttamente significa iterare su quella chiave — non su un contatore.

Il ciclo

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

Quando LastEvaluatedKey è undefined, hai raggiunto la fine. Riconsegnalo come ExclusiveStartKey per recuperare la fetta successiva.

Il flusso di controllo è un singolo ciclo che termina solo su una chiave assente:

presentabsentQuery / ScanProcess ItemsLastEvaluatedKey?Set ExclusiveStartKeyDone

Ogni passata o riprende dalla chiave restituita o si ferma — non c'è alcun contatore.

Limit non è una dimensione di pagina

Limit limita quanti Item DynamoDB valuta, non quanti ne restituisce dopo una FilterExpression. Una query con Limit: 25 dietro un filtro può restituire 3 Item e consegnarti comunque un LastEvaluatedKey — devi continuare a paginare finché la chiave non è vuota, anche quando una pagina sembra corta. Un LastEvaluatedKey non vuoto non promette mai altri Item corrispondenti; solo una chiave assente dimostra che hai raggiunto la fine.

Lascia paginare l'SDK

Entrambi gli SDK avvolgono il ciclo qui sopra così puoi iterare direttamente le pagine:

// 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'])

Niente numeri di pagina

DynamoDB non ha un conteggio totale né accesso casuale alle pagine — non puoi saltare a "pagina 7" o tornare indietro senza ripetere i cursori. Progetta le UI attorno allo scroll infinito / "carica altro", non a pagine numerate. (Una query con Select: 'COUNT' legge — e fattura — comunque ogni Item corrispondente per contarli.)

Cursori stateless per le API

LastEvaluatedKey è semplicemente gli attributi chiave dell'ultimo Item. Codificalo in base64 e consegnalo ai client come un nextToken opaco; decodificalo di nuovo in ExclusiveStartKey nella richiesta successiva. Nessuno stato del cursore lato server.

Quel token è DynamoDB-JSON — esaminalo o creane uno a mano con il convertitore DynamoDB-JSON. E se stai paginando per aggirare uno Scan, di solito è un segnale che dovresti aggiungere un Index invece.

Prova DynoTable per paginare visivamente i risultati delle query, con il cursore tracciato al posto tuo.

Aggiornato