在 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 是在項目被讀取並計費之後才丟掉它們(帶 filter 的 Scan)。在熱路徑上你要的是 Query
  • Segment / TotalSegments 把它切開 — N 個非同步工作者,各自驅動自己那一段的游標,全部共用同一個用戶端。Node 很樂意讓它們並行;讀取成本不變,改變的只有牆上時鐘(何時值得這麼做)。

改用視覺化操作

DynamoDB 查詢建構器會從表單產生整支程式,分頁迴圈也包含在內,並支援 SDK v3 與另外七種輸出目標。

DynoTable 會替你在無限捲動的格線中翻完一整張線上表格,並把格線背後的 Scan 匯出成可執行的程式碼。下載 DynoTable

相關範例

參考資料

最後驗證於 2026-07-28,對照上方連結的 AWS 官方文件。

以視覺化方式建構此請求

在免費的 DynamoDB 查詢建構器中組合此操作 — 鍵條件、Filter、Index、Limit、排序方向與分頁迴圈 — 再把它複製成可執行的 SDK v3、CLI 或 boto3 程式。

開啟 DynamoDB 查詢建構器

不必透過主控台就能操作 DynamoDB

一款快速的 DynamoDB 桌面用戶端,可執行 DynamoDB 無法執行的真正 SQL — JOINs、GROUP BY、聚合 — 並支援視覺化編輯與使用你自己的 Bedrock 金鑰的 AI 代理。

30 天免費試用,無需信用卡 — 之後為無時間限制的免費方案。