Node.js (AWS SDK v3) で DynamoDB のすべてのアイテムを取得する

DynamoDB に「select all」はありません。テーブル全体を読み取るとは、最後までページネーションする Scan を意味します。各レスポンスは最大でも1 MB を運びます。LastEvaluatedKeyExclusiveStartKey として戻しながらループし、キーが返らなくなるまで続けます。

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`);

Explanation

  • ループこそが要点 — 単一の Scan 呼び出しはテーブルを返しません。最大1 MB を返します。最初のレスポンスの後で止めるのが、典型的な「スキャンでアイテムが欠落する」バグです。LastEvaluatedKey が存在しないことだけが、すべてを読み終えたことを意味します。
  • メモリitems はテーブル全体を保持します。大きなテーブルでは、蓄積する代わりにループ内で各ページを処理してください(ファイルに書き込む、ストリームする、集計する)。
  • 大きなテーブルでより高速: 並列スキャンSegment / TotalSegments で作業を分割します。N 個のワーカーを実行し、それぞれが自分のセグメントを自分のページネーションループでスキャンします。合計コストは同じで、実時間は大幅に短くなります。
  • コスト — フルスキャンは、実行するたびにすべてのアイテムの全バイトを読み取り(課金し)ます。ProjectionExpression でレスポンスを絞れます(返される属性は減りますが、読み取りコストは同じです)。そしてスキャンをホットパスに置かないでください。それは Query とアクセスパターン設計のためのものです。
  • ついでにフィルタリング?FilterExpression はアイテムが読み取られて(課金されて)からそれらを落とします — Scan with a filter を参照。

Do it visually

テーブルをざっと見るのにスクリプトは要りません。DynoTable をダウンロードすれば、任意のテーブルをページネーションされたグリッドで閲覧できます。スキャンのページ送りを代わりに行うので、間違えるループはありません。そしてスキャンして課金される前に、DynamoDB pricing calculator がテーブルのフル読み取りが実際にいくらかかるかを示します。

References

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

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

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

DynamoDB クエリビルダーを開く

Console なしで DynamoDB を扱う

DynoTable は DynamoDB 向けの高速なデスクトップクライアントです — テーブルを閲覧し、SQL スタイルのクエリを実行し、アイテムをローカルで編集できます。