Node.js(AWS SDK v3)中从 DynamoDB 获取所有项目
DynamoDB 中没有"select all"——读取整张表意味着一次你要分页到底的 Scan。每个响应最多携带 1 MB;你要循环,把 LastEvaluatedKey 作为 ExclusiveStartKey 送回,直到不再有键返回。
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`);说明
- 循环才是关键 — 单次
Scan调用不会返回整张表;它返回至多 1 MB。在第一个响应后就停下,正是经典的"我的 scan 漏了项目"这个 bug。只有当LastEvaluatedKey缺失时,才表示你已经读完一切。 - 内存 —
items会持有整张表。对于大表,请在循环内处理每一页(写入文件、流式处理、聚合),而不是累积。 - 大表上更快:并行 scan — 用
Segment/TotalSegments拆分工作:运行 N 个工作线程,每个用自己的分页循环扫描自己的段。总成本相同,但墙钟时间大幅降低。 - 成本 — 一次全表 scan 每次运行都会读取(并计费)每个项目的每个字节。用
ProjectionExpression精简响应(返回更少属性——读取成本不变),并且不要把 scan 放在热路径上;那是 Query 和访问模式设计要解决的事。 - 顺手做过滤?
FilterExpression会在项目被读取(并计费)之后才丢弃它们——见 带过滤器的 Scan。
可视化操作
浏览一张表不需要脚本:下载 DynoTable 即可在分页网格中浏览任何表——它会替你翻阅 scan 的各页,没有写错循环的风险。而在你 scan 并付费之前,DynamoDB 定价计算器会显示完整读取你的表实际花费多少。
相关示例
- Python 中获取所有项目 — 用 boto3 的分页器完成同样的全表读取。
- 使用 AWS CLI 获取所有项目 — CLI 会替你翻页。
- Node.js 中的 DynamoDB Scan — 带
FilterExpression的扫描。 - 并行 scan — Segment/TotalSegments、工作线程数量,以及何时值得这么做。
- 为什么我的 DynamoDB Scan 又慢又贵? — 成本模型以及如何避免。
- DynamoDB ProvisionedThroughputExceededException — 读取整张表是撞上它的经典方式。
- "The provided starting key is invalid" — 分页循环中损坏的续读键。
References
- 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
Last verified 2026-07-13 against the official AWS documentation linked above.