Débutant4 min de lecture

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 :

presentabsentQuery / ScanProcess ItemsLastEvaluatedKey?Set ExclusiveStartKeyDone

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.

Mis à jour