Node.js (AWS SDK v3) で DynamoDB から全アイテムを取得する

SDK v3 でテーブル全体を読むとは、Scan を最後までページングすることです。各レスポンスは 1 MB で頭打ちになるので、LastEvaluatedKeyExclusiveStartKey として戻し、それが返ってこなくなるまで繰り返します(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'})) です。上のループが手で扱っているのと同じ 3 つのカーソルフィールド(ExclusiveStartKeyLastEvaluatedKeyLimit)から生成されているので、切り替えても挙動は変わりません。
  • 完了を意味するのは LastEvaluatedKey が無いことだけですItems が 0 件でカーソルがあるレスポンスは正常であり、テーブルが空なのではありません。Items.length === 0 で break するのが典型的な「行が抜ける」バグで、FilterExpression があると空ページは稀どころか日常茶飯事になります。
  • Limit は 1 回の呼び出しで評価するアイテム数であって、合計数ではありません。これはページネーターが駆動する 3 つ目のフィールドですが、これもページネーターの pageSize も、最終的に手元に抱える配列の大きさを制限しません。
  • 初回の ExclusiveStartKey: undefined は問題ありません。シリアライザーは undefined のメンバーを落とすので、最初の反復に特別扱いは要りません。
  • items はテーブルの大きさまで膨らみます。テーブルが小さいと分かっている場合を除き、各ページをループの中で処理して手放しましょう(書き出す、ストリームに流す、集計する)。溜め込む書き方は、テーブルがひと回り育っただけでメモリ不足のクラッシュになります。
  • スキャンは実行のたびに、読んだバイトすべてに課金しますProjectionExpression はネットワークを流れる量を減らしますが、請求額は減らしません(理由)。FilterExpression はアイテムが読まれて課金された後に落とします(フィルター付きの Scan)。ホットパスで欲しいのは Query です。
  • Segment / TotalSegments で分割します。N 個の非同期ワーカーが、それぞれ自分の担当スライスに対して自分のカーソルを回し、すべて 1 つの共有クライアントに乗ります。Node は喜んで並行に走らせます。変わるのは実時間だけで、読み取りコストは変わりません(それが割に合うのはどんなときか)。

ビジュアルに行う

DynamoDB クエリビルダーは、このプログラム全体を、ページネーションループも含めてフォームから生成します。SDK v3 と、他 7 つのターゲットに対応しています。

DynoTable は無限スクロールのグリッドでライブのテーブルを代わりにページングし、そのグリッドの裏にある Scan を実行可能なコードとしてエクスポートします。DynoTable をダウンロード

関連する例

参考資料

最終検証日 2026-07-28、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

このリクエストをビジュアルに組み立てる

この操作を無料の DynamoDB クエリビルダーで組み立て — キー条件、フィルタ、インデックス、Limit、ソート順、ページネーションループ — 実行可能な SDK v3・CLI・boto3 のプログラムとしてコピーして戻れます。

DynamoDB クエリビルダーを開く

Console なしで DynamoDB を扱う

DynamoDB では実行できない本物の SQL(JOINs、GROUP BY、集計)を実行する高速な DynamoDB デスクトップクライアント。ビジュアル編集と、あなた自身の Bedrock キーで動く AI エージェントを備えています。

30日間無料トライアル、クレジットカード不要 — その後は期限のない Free プラン。