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

  • paginateScan fait déjà tout çaimport {paginateScan} from '@aws-sdk/client-dynamodb', puis for 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 LastEvaluatedKey signifie « terminé » — une réponse à zéro Items accompagnée d'un curseur est normale, ce n'est pas une table vide. S'arrêter sur Items.length === 0 est le bug classique des lignes manquantes, et une FilterExpression rend les pages vides routinières plutôt que rares.
  • Limit compte 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 le pageSize du paginateur ne bornent la taille du tableau que tu finis par garder en mémoire.
  • ExclusiveStartKey: undefined au 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.
  • items grossit 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écutionProjectionExpression réduit ce qui passe sur le réseau et non la facture (pourquoi), et une FilterExpression é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éférences

Dernière vérification le 2026-07-28 par rapport à la documentation officielle AWS liée ci-dessus.

Construis cette requête visuellement

Compose cette opération dans le Générateur de requêtes DynamoDB gratuit — condition de clé, filtre, index, Limit, ordre de tri et boucle de pagination — et copie-la en retour comme programme exécutable SDK v3, CLI ou boto3.

Ouvrir le Générateur de requêtes DynamoDB

Travaille avec DynamoDB sans la Console

Un client de bureau rapide pour DynamoDB qui exécute le vrai SQL que DynamoDB ne peut pas — JOINs, GROUP BY, agrégations — avec édition visuelle et un agent IA sur tes propres clés Bedrock.

Essai gratuit de 30 jours, sans carte bancaire — ensuite la formule Gratuit, sans limite de durée.