Node.js(AWS SDK v3)中获取 DynamoDB 的全部项
在 SDK v3 里读完整张表,意味着把一次 Scan 分页到底。每个响应上限是 1 MB,你要把 LastEvaluatedKey 作为 ExclusiveStartKey 喂回去,直到它不再返回为止(DynamoDB 的游标是怎么回事)。
下面的循环是手写的,好让游标看得见。真实代码里你会直接用 SDK 自带的 paginateScan。
代码
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`);说明
paginateScan已经把这件事做了——import {paginateScan} from '@aws-sdk/client-dynamodb',然后for await (const page of paginateScan({client}, {TableName: 'Music'}))。它是用上面手写循环所用的同样三个游标字段(ExclusiveStartKey、LastEvaluatedKey、Limit)生成的,所以换过去不会改变任何行为。- 只有
LastEvaluatedKey缺席才代表读完了——Items为零但带着游标的响应是正常的,并不是空表。以Items.length === 0作为退出条件是经典的丢数据 bug,而一旦加上FilterExpression,空页就从罕见变成家常便饭。 Limit数的是每次调用检查的项数,不是总项数——它是分页器驱动的第三个字段,而不管是它还是分页器的pageSize,都不会限制你最终握在手里的那个数组有多大。- 第一轮的
ExclusiveStartKey: undefined没有问题——序列化器会丢掉 undefined 成员,所以第一次迭代不需要任何特殊处理。 items会长到整张表那么大——除非你确定表很小,否则请在循环内部处理每一页然后放掉它(写出去、流式处理、做聚合)。一路累积,离一次表增长导致的内存溢出只有一步之遥。- 扫描每跑一次,读到的每个字节都要计费——
ProjectionExpression缩小的是过网的数据量而不是账单(为什么),而FilterExpression是在项被读取并计费之后才把它们丢掉的(带过滤的 Scan)。在热路径上你要的是 Query。 - 用
Segment/TotalSegments把它拆开——N 个异步 worker,各自驱动自己那一片上的游标,全都共用一个客户端。Node 会很乐意并发跑它们;读取成本不变,变的只有墙上时钟(什么时候值得这么做)。
用可视化的方式来做
DynamoDB 查询构建器能从一个表单生成整个程序,分页循环也包括在内,支持 SDK v3 以及另外七种目标。
DynoTable 会在一个无限滚动的表格里替你翻完整张实时表,并把表格背后的那次 Scan 导出成可运行的代码。下载 DynoTable。
相关示例
- Python 中获取全部项——用 boto3 的分页器做同样的全表读取。
- 用 AWS CLI 获取全部项——CLI 会替你分页。
- Node.js 中的 DynamoDB Scan——带
FilterExpression的扫描。 - 并行扫描——Segment/TotalSegments、worker 数量,以及什么时候值得折腾。
- 为什么我的 DynamoDB Scan 又慢又贵?——成本模型,以及怎么避开它。
- DynamoDB ProvisionedThroughputExceededException——读整张表是撞上它的经典方式。
- "The provided starting key is invalid"——分页循环里被弄坏的续读键。
参考资料
- 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)
最后核实于 2026-07-28,依据上方链接的 AWS 官方文档。