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 定价计算器会显示完整读取你的表实际花费多少。

相关示例

References

Last verified 2026-07-13 against the official AWS documentation linked above.

可视化构建此请求

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

打开 DynamoDB 查询构建器

无需控制台即可使用 DynamoDB

DynoTable 是面向 DynamoDB 的快速桌面客户端 —— 浏览表、运行 SQL 风格的查询,并在本地编辑项。