使用Node.js和@aws-sdk/lib-dynamodb调用DynamoDB分页无法获取全量数据
问题原因与解决方案
为什么每次请求仅返回约327条数据?
这是DynamoDB Scan操作的响应大小限制导致的:
- DynamoDB默认限制单个Scan请求的响应总大小(包含数据、元数据等)不能超过1MB,这个限制优先级高于你设置的
Limit参数。 - 按你返回的条目数估算,每条数据平均大小约3KB(1MB ÷ 327 ≈ 3KB),当返回327条时总大小已触达1MB上限,请求会提前终止,不会达到你设置的400条
Limit值,同时返回LastEvaluatedKey用于后续分页扫描。
你的代码逻辑是否能获取全部数据?
你写的循环扫描逻辑是正确的:通过do-while循环,每次用LastEvaluatedKey作为下一次扫描的ExclusiveStartKey,直到没有LastEvaluatedKey为止,理论上最终能拿到表中全部750条数据。
如果实际运行后scan.len未达到750,可排查以下方向:
- 确认DynamoDB控制台显示的表条目数确实为750,避免数据统计误差。
- 检查
docClient的配置是否正确(如区域、表名是否匹配),确保有权限访问全表数据。 - 确认表中没有隐性过滤规则(比如未设置
FilterExpression,但存在全局二级索引或其他配置限制了扫描范围)。
优化建议
如果想让单次请求返回更多数据,可以调整MaxScanRequestSize参数,将响应大小上限提升至最大10MB:
const scanParams = { TableName: this.tableName, Limit: pageSize, ExclusiveStartKey: startKey, MaxScanRequestSize: 10485760 // 10MB,单位为字节 };
注意:即使调整该参数,仍然受限于大小限制无法突破;如果数据量持续增长,建议改用Query操作(配合合理的分区键设计)或并行扫描(设置TotalSegments)来提升扫描效率。
内容的提问来源于stack exchange,提问作者Victoriia Bar
相关产品推荐
相关产品推荐

