在 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'}))。它是由上面那個手寫迴圈所用的同樣三個游標欄位(ExclusiveStartKey、LastEvaluatedKey、Limit)產生出來的,所以換過去不會改變任何行為。- 只有
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。
相關範例
- Python 中取得全部項目 — 以 boto3 的分頁器做同一次全表讀取。
- 使用 AWS CLI 取得全部項目 — CLI 會替你分頁。
- Node.js 中的 DynamoDB Scan — 帶
FilterExpression的掃描。 - 平行掃描 — Segment/TotalSegments、工作者數量,以及何時值得動用。
- 為什麼我的 DynamoDB Scan 又慢又貴? — 成本模型與如何避開它。
- DynamoDB ProvisionedThroughputExceededException — 讀完整張表格是撞上它的經典方式。
- "The provided starting key is invalid" — 分頁迴圈裡被弄壞的續讀鍵。
參考資料
- 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
- [
paginateScan— AWS SDK for JavaScript v3 source](https://github.com/aws/aws-sdk-js-v3/blob/main/the client-dynamodb ScanPaginator module)
最後驗證於 2026-07-28,對照上方連結的 AWS 官方文件。