Obtener todos los Items de DynamoDB en Node.js (SDK de AWS v3)
Leer una tabla entera en el SDK v3 significa paginar un Scan hasta el final. Cada respuesta tiene un tope de 1 MB, y devuelves LastEvaluatedKey como ExclusiveStartKey hasta que deja de llegar (cómo funcionan los cursores de DynamoDB).
El bucle de abajo está escrito a mano para que el cursor quede a la vista. En código real recurrirías a paginateScan, que el SDK ya incluye.
Código
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`);Explicación
paginateScanya hace esto —import {paginateScan} from '@aws-sdk/client-dynamodb', y luegofor await (const page of paginateScan({client}, {TableName: 'Music'})). Se genera a partir de los mismos tres campos de cursor que el bucle de arriba usa a mano (ExclusiveStartKey,LastEvaluatedKey,Limit), así que nada cambia de comportamiento cuando te pasas a él.- Solo un
LastEvaluatedKeyausente significa que has terminado — una respuesta con ceroItemsy un cursor es normal, no una tabla vacía. Cortar conItems.length === 0es el clásico bug de filas que faltan, y unaFilterExpressionhace que las páginas vacías sean rutina en vez de rareza. Limitcuenta Items evaluados por llamada, no Items en total — es el tercer campo que maneja el paginador, y ni él ni elpageSizedel paginador acotan el tamaño del array que acabas reteniendo.ExclusiveStartKey: undefineden la primera pasada está bien — el serializador descarta los miembros undefined, así que la primera iteración no necesita ningún caso especial.itemscrece hasta el tamaño de la tabla — procesa cada página dentro del bucle y suéltala (escribe, transmite, agrega) salvo que sepas que la tabla es pequeña. Acumular está a un crecimiento de tabla de un fallo por falta de memoria.- Un scan factura cada byte que lee, en cada ejecución —
ProjectionExpressionreduce lo que cruza la red pero no la factura (por qué), y unaFilterExpressiondescarta Items después de leerlos y cobrarlos (Scan con un filtro). En un camino caliente lo que quieres es un Query. - Divídelo con
Segment/TotalSegments— N workers asíncronos, cada uno manejando su propio cursor sobre su propia porción, todos sobre un cliente compartido. Node los ejecutará concurrentemente sin problema; el coste de lectura no cambia, solo el tiempo de reloj (cuándo merece la pena).
Hazlo visualmente
El generador de consultas de DynamoDB genera este programa entero, bucle de paginación incluido, desde un formulario, en el SDK v3 y otros siete destinos.
DynoTable pagina por ti una tabla en vivo en una cuadrícula de scroll infinito, y exporta el Scan que hay detrás de esa cuadrícula como código ejecutable. Descarga DynoTable.
Ejemplos relacionados
- Obtener todos los Items en Python — la misma lectura completa con el paginador de boto3.
- Obtener todos los Items con la AWS CLI — la CLI pagina por ti.
- Scan de DynamoDB en Node.js — hacer scan con una
FilterExpression. - Scans paralelos — Segment/TotalSegments, número de workers y cuándo molestarse.
- ¿Por qué mi Scan de DynamoDB es lento y caro? — el modelo de coste y cómo evitarlo.
- DynamoDB ProvisionedThroughputExceededException — leer la tabla entera es la forma clásica de provocarlo.
- «The provided starting key is invalid» — una clave de reanudación estropeada en el bucle de paginación.
Referencias
- 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)
Verificado por última vez el 2026-07-28 contra la documentación oficial de AWS enlazada arriba.