在 Node.js(AWS SDK v3)中讀取 DynamoDB 所有項目
DynamoDB 沒有「select all」— 讀取整個表格意味著一個你要分頁到底的 Scan。每個回應最多帶 1 MB;你要進行迴圈,把 LastEvaluatedKey 餵回作為 ExclusiveStartKey,直到不再回傳 key。
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 個 worker,每個以自己的分頁迴圈掃描自己的 segment。總成本相同,但實際耗時大幅降低。 - 成本 — 完整 scan 每次執行都會讀取(並計費)每個項目的每個位元組。以
ProjectionExpression精簡回應(回傳較少屬性 — 讀取成本不變),且別把 scan 放在熱路徑上;那是 Query 與存取模式設計的用武之地。 - 順便過濾?
FilterExpression會在項目被讀取(並計費)之後丟棄它們 — 見 帶 filter 的 Scan。
改用視覺化操作
單純看看一個表格,不需要指令稿:下載 DynoTable 即可在分頁的格線中瀏覽任何表格 — 它會為你翻過 scan 的分頁,沒有迴圈可寫錯。而在你 scan 並付費之前,DynamoDB 定價計算機 會顯示完整讀取一次你的表格實際花多少。
相關範例
- 在 Python 中讀取所有項目 — 以 boto3 的 paginator 執行相同的完整讀取。
- 使用 AWS CLI 讀取所有項目 — CLI 為你分頁。
- 在 Node.js 中使用 DynamoDB Scan — 帶
FilterExpression的 scan。 - 平行 Scan — Segment/TotalSegments、worker 數量,以及何時值得。
- 為什麼我的 DynamoDB Scan 又慢又貴? — 成本模型以及如何避免它。
- DynamoDB ProvisionedThroughputExceededException — 讀取整個表格是撞上它的經典做法。
- "The provided starting key is invalid" — 分頁迴圈中損壞的續讀 key。
References
- 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
最後驗證於 2026-07-13,對照上方連結的 AWS 官方文件。