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
paginateScanfa già questo —import {paginateScan} from '@aws-sdk/client-dynamodb', poifor 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
LastEvaluatedKeyassente significa "finito" — una risposta con zeroItemse un cursore è normale, non una tabella vuota. Interrompere suItems.length === 0è il classico bug delle righe mancanti, e unaFilterExpressionrende le pagine vuote routine invece che rare. Limitconta gli Item valutati per chiamata, non gli Item in totale — è il terzo campo che il paginator pilota, e né lui né ilpageSizedel paginator limitano la dimensione dell'array che ti ritrovi in mano.ExclusiveStartKey: undefinedal primo passaggio va bene — il serializzatore scarta i membri undefined, quindi la prima iterazione non richiede alcun caso speciale.itemscresce 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 esecuzione —
ProjectionExpressionriduce ciò che attraversa la rete, non la fattura (perché), e unaFilterExpressionscarta 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
- Recuperare tutti gli Item in Python — la stessa lettura completa con il paginator di boto3.
- Recuperare tutti gli Item con la AWS CLI — la CLI pagina per te.
- Scan DynamoDB in Node.js — lo scan con una
FilterExpression. - Scan paralleli — Segment/TotalSegments, numero di worker e quando vale la pena.
- Perché il mio Scan DynamoDB è lento e costoso? — il modello di costo e come evitarlo.
- DynamoDB ProvisionedThroughputExceededException — leggere l'intera tabella è il modo classico per incapparci.
- "The provided starting key is invalid" — una chiave di ripresa storpiata nel loop di paginazione.
Riferimenti
- 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)
Ultima verifica 2026-07-28 rispetto alla documentazione ufficiale AWS collegata sopra.