Récupérer tous les éléments DynamoDB en Node.js (AWS SDK v3)
Lire une table entière avec le SDK v3, c'est paginer un Scan jusqu'au bout. Chaque réponse plafonne à 1 Mo, et tu réinjectes LastEvaluatedKey comme ExclusiveStartKey jusqu'à ce qu'il cesse de revenir (comment fonctionnent les curseurs DynamoDB).
La boucle ci-dessous est écrite à la main pour que le curseur reste visible. Dans du vrai code, tu prendrais paginateScan, que le SDK livre déjà.
Code
import {DynamoDBClient, ScanCommand} from '@aws-sdk/client-dynamodb';
const client = new DynamoDBClient({region: 'us-east-1'});
const items = [];
let lastEvaluatedKey;
do {
const response = await client.send(
new ScanCommand({
TableName: 'Music',
ExclusiveStartKey: lastEvaluatedKey
})
);
items.push(...(response.Items ?? []));
lastEvaluatedKey = response.LastEvaluatedKey;
} while (lastEvaluatedKey);
console.log(`Table holds ${items.length} items`);Explication
paginateScanfait déjà tout ça —import {paginateScan} from '@aws-sdk/client-dynamodb', puisfor await (const page of paginateScan({client}, {TableName: 'Music'})). Il est généré à partir des trois mêmes champs de curseur que la boucle ci-dessus manipule à la main (ExclusiveStartKey,LastEvaluatedKey,Limit), donc rien ne change de comportement quand tu bascules.- Seule l'absence de
LastEvaluatedKeysignifie « terminé » — une réponse à zéroItemsaccompagnée d'un curseur est normale, ce n'est pas une table vide. S'arrêter surItems.length === 0est le bug classique des lignes manquantes, et uneFilterExpressionrend les pages vides routinières plutôt que rares. Limitcompte les éléments évalués par appel, pas les éléments au total — c'est le troisième champ que le paginateur pilote, et ni lui ni lepageSizedu paginateur ne bornent la taille du tableau que tu finis par garder en mémoire.ExclusiveStartKey: undefinedau premier passage ne pose aucun problème — le sérialiseur supprime les membres undefined, donc la première itération n'a besoin d'aucun cas particulier.itemsgrossit jusqu'à la taille de la table — traite chaque page à l'intérieur de la boucle puis laisse-la partir (écriture, flux, agrégation) sauf si tu sais que la table est petite. Accumuler, c'est se trouver à une croissance de table d'un crash mémoire.- Un scan facture chaque octet qu'il lit, à chaque exécution —
ProjectionExpressionréduit ce qui passe sur le réseau et non la facture (pourquoi), et uneFilterExpressionécarte les éléments après qu'ils ont été lus et facturés (Scan avec un filtre). Sur un chemin chaud, c'est un Query que tu veux. - Découpe-le avec
Segment/TotalSegments— N workers asynchrones, chacun pilotant son propre curseur sur sa propre tranche, tous sur un client partagé. Node les exécutera volontiers en parallèle ; le coût de lecture ne change pas, seul le temps écoulé (quand ça en vaut la peine).
Le faire visuellement
Le constructeur de requêtes DynamoDB génère ce programme entier, boucle de pagination comprise, à partir d'un formulaire, en SDK v3 et dans sept autres cibles.
DynoTable pagine une table en direct pour toi dans une grille à défilement infini, et exporte le Scan derrière cette grille sous forme de code exécutable. Télécharge DynoTable.
Exemples liés
- Récupérer tous les éléments en Python — la même lecture complète avec le paginateur de boto3.
- Récupérer tous les éléments avec l'AWS CLI — la CLI pagine pour toi.
- DynamoDB Scan en Node.js — scanner avec une
FilterExpression. - Les scans parallèles — Segment/TotalSegments, nombre de workers, et quand s'y mettre.
- Pourquoi mon Scan DynamoDB est-il lent et coûteux ? — le modèle de coût et comment l'éviter.
- DynamoDB ProvisionedThroughputExceededException — lire toute la table est la façon classique de la déclencher.
- "The provided starting key is invalid" — une clé de reprise abîmée dans la boucle de pagination.
Références
- Scan — Amazon DynamoDB API Reference
- Scanning tables in DynamoDB — Amazon DynamoDB Developer Guide
- DynamoDB read and write operations (capacity unit consumption) — Amazon DynamoDB Developer Guide
- [
paginateScan— AWS SDK for JavaScript v3 source](https://github.com/aws/aws-sdk-js-v3/blob/main/the client-dynamodb ScanPaginator module)
Dernière vérification le 2026-07-28 par rapport à la documentation officielle AWS liée ci-dessus.