Principiante4 min di lettura

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:

presenteassenteQuery / ScanElabora gli ItemLastEvaluatedKey?Imposta ExclusiveStartKeyFatto

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.

Aggiornato