Recuperare tutti gli Item da DynamoDB in Node.js (AWS SDK v3)

Leggere un'intera tabella in SDK v3 significa paginare una Scan fino in fondo. Ogni risposta si ferma a 1 MB, e rimetti LastEvaluatedKey come ExclusiveStartKey finché non smette di tornare (come funzionano i cursori di DynamoDB).

Il loop qui sotto è scritto a mano così il cursore è visibile. Nel codice reale ricorreresti a paginateScan, che l'SDK fornisce già.

Codice

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`);

Spiegazione

  • paginateScan fa già questoimport {paginateScan} from '@aws-sdk/client-dynamodb', poi for await (const page of paginateScan({client}, {TableName: 'Music'})). È generato dagli stessi tre campi di cursore che il loop qui sopra usa a mano (ExclusiveStartKey, LastEvaluatedKey, Limit), quindi passando ad esso nulla cambia nel comportamento.
  • Solo un LastEvaluatedKey assente significa "finito" — una risposta con zero Items e un cursore è normale, non una tabella vuota. Interrompere su Items.length === 0 è il classico bug delle righe mancanti, e una FilterExpression rende le pagine vuote routine invece che rare.
  • Limit conta gli Item valutati per chiamata, non gli Item in totale — è il terzo campo che il paginator pilota, e né lui né il pageSize del paginator limitano la dimensione dell'array che ti ritrovi in mano.
  • ExclusiveStartKey: undefined al primo passaggio va bene — il serializzatore scarta i membri undefined, quindi la prima iterazione non richiede alcun caso speciale.
  • items cresce fino alla dimensione della tabella — elabora ogni pagina dentro il loop e lasciala andare (scrivi, streamma, aggrega) a meno che tu non sappia che la tabella è piccola. Accumulare è a una crescita della tabella di distanza da un crash per esaurimento memoria.
  • Uno scan fattura ogni byte che legge, a ogni esecuzioneProjectionExpression riduce ciò che attraversa la rete, non la fattura (perché), e una FilterExpression scarta gli Item dopo che sono stati letti e addebitati (Scan con un filtro). Su un percorso caldo vuoi una Query.
  • Dividilo con Segment / TotalSegments — N worker asincroni, ciascuno che pilota il proprio cursore sulla propria fetta, tutti su un unico client condiviso. Node li eseguirà volentieri in concorrenza; il costo di lettura non cambia, cambia solo il tempo a orologio (quando ne vale la pena).

Fallo visivamente

Il query builder DynamoDB genera questo intero programma, loop di paginazione incluso, da un modulo, in SDK v3 e in altri sette target.

DynoTable pagina al posto tuo una tabella live in una griglia a scorrimento infinito, ed esporta lo Scan dietro a quella griglia come codice eseguibile. Scarica DynoTable.

Esempi correlati

Riferimenti

Ultima verifica 2026-07-28 rispetto alla documentazione ufficiale AWS collegata sopra.

Costruisci questa richiesta visivamente

Componi questa operazione nel Generatore di query DynamoDB gratuito — condizione di chiave, filtro, indice, Limit, ordine di ordinamento e un loop di paginazione — e copiala come programma eseguibile per SDK v3, CLI o boto3.

Apri il Generatore di query DynamoDB

Lavora con DynamoDB senza la Console

Un client desktop veloce per DynamoDB che esegue il vero SQL che DynamoDB non può — JOINs, GROUP BY, aggregazioni — con modifica visuale e un agente AI sulle tue chiavi Bedrock.

Prova gratuita di 30 giorni, senza carta di credito — poi il piano Free senza limiti di tempo.