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