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'}))。它是用上面手写循环所用的同样三个游标字段(ExclusiveStartKeyLastEvaluatedKeyLimit)生成的,所以换过去不会改变任何行为。
  • 只有 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

相关示例

参考资料

最后核实于 2026-07-28,依据上方链接的 AWS 官方文档。

可视化构建此请求

在免费的 DynamoDB 查询构建器中组装此操作 —— 键条件、筛选、索引、Limit、排序方向和分页循环 —— 再把它作为可运行的 SDK v3、CLI 或 boto3 程序复制回来。

打开 DynamoDB 查询构建器

无需控制台即可使用 DynamoDB

一款快速的 DynamoDB 桌面客户端,可运行 DynamoDB 无法执行的真正 SQL——JOINs、GROUP BY、聚合——并支持可视化编辑和运行在你自己的 Bedrock 密钥上的 AI agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。