Paginazione in DynamoDB
DynamoDB non restituisce mai "tutti" i risultati in una sola chiamata. Una Query o uno Scan restituiscono
al massimo 1 MB di dati, poi ti passano un LastEvaluatedKey da cui riprendere. Fare bene la
paginazione significa iterare su quella chiave — non su un contatore.
Come funziona la paginazione in DynamoDB?
Una Query o uno Scan restituiscono al massimo 1 MB per chiamata, poi restituiscono un LastEvaluatedKey. Per paginare, passi quella chiave come ExclusiveStartKey della chiamata successiva e iteri finché DynamoDB non restituisce più alcuna chiave. Non ci sono numeri di pagina, nessun conteggio totale, e Limit limita gli Item valutati — non gli Item restituiti.
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. Passalo di nuovo come
ExclusiveStartKey per recuperare la porzione successiva.
Il flusso di controllo è un singolo ciclo che termina solo su una chiave assente:
Ogni passaggio 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
darti 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 racchiudono il ciclo qui sopra così puoi iterare direttamente sulle 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'])Nessun numero di pagina
DynamoDB non ha conteggio totale né accesso casuale alle pagine — non puoi saltare alla
"pagina 7" o tornare indietro senza rieseguire i cursori. Progetta le UI attorno allo
scroll infinito / "carica altro", non a pagine numerate. (Una query con Select: 'COUNT'
legge comunque — e fattura — ogni Item corrispondente per contarlo.)
Cursori stateless per le API
LastEvaluatedKey non è altro che gli attributi chiave dell'ultimo Item. Codificalo in base64
e passalo ai client come un nextToken opaco; decodificalo di nuovo in
ExclusiveStartKey alla richiesta successiva. Nessuno stato di cursore lato server.
Quel token è DynamoDB-JSON — ispezionalo o creane uno a mano con il convertitore DynamoDB-JSON. E se stai paginando per aggirare uno Scan, di solito è il segnale di aggiungere invece un indice.
Per evitare del tutto di scrivere il loop, il generatore di query compone la richiesta Query/Scan completa ed emette un programma eseguibile per SDK v3, CLI o boto3 — loop di paginazione incluso.
Prova DynoTable per paginare visivamente tra i risultati di una query, con il cursore tracciato per te.