La pagination dans DynamoDB
DynamoDB ne renvoie jamais « tous » les résultats en un seul appel. Un Query ou
un Scan renvoie au plus 1 MB de données, puis te remet un LastEvaluatedKey pour
reprendre. Bien paginer, c'est boucler sur cette clé — pas sur un compteur.
La boucle
let key;
do {
const out = await client.send(new QueryCommand({...params, ExclusiveStartKey: key}));
process(out.Items);
key = out.LastEvaluatedKey;
} while (key);Quand LastEvaluatedKey vaut undefined, tu as atteint la fin. Repasse-la comme
ExclusiveStartKey pour récupérer la tranche suivante.
Le flux de contrôle est une seule boucle qui ne sort que sur une clé absente :
Chaque passage reprend depuis la clé renvoyée ou s'arrête — il n'y a pas de compteur.
Limit n'est pas une taille de page
Limit plafonne le nombre d'items que DynamoDB évalue, pas le nombre qu'il
renvoie après un FilterExpression. Une requête Limit: 25 derrière un filtre peut
renvoyer 3 items et quand même te remettre un LastEvaluatedKey — tu dois continuer
à paginer jusqu'à ce que la clé soit vide, même quand une page paraît courte. Un
LastEvaluatedKey non vide ne promet pas non plus davantage d'items
correspondants ; seule une clé absente prouve que tu as atteint la fin.
Laisse le SDK paginer
Les deux SDK enveloppent la boucle ci-dessus pour que tu puisses itérer directement sur les pages :
// 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'])Pas de numéros de page
DynamoDB n'a ni compte total ni accès aléatoire aux pages — tu ne peux pas
sauter à la « page 7 » ni revenir en arrière sans rejouer les curseurs. Conçois les
UI autour du défilement infini / « charger plus », pas de pages numérotées. (Une
requête Select: 'COUNT' lit — et facture — quand même chaque item correspondant
pour le compter.)
Curseurs sans état pour les API
LastEvaluatedKey n'est que les attributs de clé du dernier item. Encode-le en
base64 et remets-le aux clients comme un nextToken opaque ; redécode-le en
ExclusiveStartKey à la requête suivante. Aucun état de curseur côté serveur.
Ce token est du DynamoDB-JSON — inspecte-le ou fabrique-en un à la main avec le convertisseur DynamoDB-JSON. Et si tu pagines pour contourner un Scan, c'est en général le signe qu'il faut plutôt ajouter un index.
Essaie DynoTable pour parcourir les résultats de requête visuellement, avec le curseur suivi pour toi.