Go (AWS SDK v2) での DynamoDB Scan

Scan はテーブルまたはインデックス内のすべてのアイテムをページごとに読み取り、その後任意で FilterExpression によって行を除外します。AWS SDK for Go v2 では、組み込みの ScanPaginator がテーブル全体が読み取られるまで LastEvaluatedKey を追跡します。

Code

package main

import (
	"context"
	"fmt"
	"log"

	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/config"
	"github.com/aws/aws-sdk-go-v2/service/dynamodb"
	"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
)

func main() {
	ctx := context.TODO()
	cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion("us-east-1"))
	if err != nil {
		log.Fatalf("load config: %v", err)
	}
	client := dynamodb.NewFromConfig(cfg)

	paginator := dynamodb.NewScanPaginator(client, &dynamodb.ScanInput{
		TableName:        aws.String("Music"),
		FilterExpression: aws.String("#filter0 >= :filterValue0"),
		ExpressionAttributeNames: map[string]string{
			"#filter0": "Year",
		},
		ExpressionAttributeValues: map[string]types.AttributeValue{
			":filterValue0": &types.AttributeValueMemberN{Value: "2010"},
		},
	})

	var items []map[string]types.AttributeValue
	for paginator.HasMorePages() {
		page, err := paginator.NextPage(ctx)
		if err != nil {
			log.Fatalf("scan: %v", err)
		}
		items = append(items, page.Items...)
	}
	fmt.Printf("Matched %d items\n", len(items))
}

Explanation

  • FilterExpression — 読み取りに、サーバー側で適用されます。レスポンスを小さくしますが、コストは減りません。フィルターの有無にかかわらず、スキャンしたすべてのアイテムの読み取り分を支払います。
  • ExpressionAttributeNames — フィルター対象の属性はエイリアス化され(#filter0Year)、Year のような予約語を安全に扱えます。
  • ページネーション — 各 Scan ページはフィルター に最大 1 MB を読み取るため、テーブルにまだ一致するものがあってもフィルター後のページが空で返ってくることがあります。dynamodb.NewScanPaginatorLastEvaluatedKey が尽きるまで呼び出しを続けます。最初のページで止めてはいけません。
  • ページごとにスキャンされるアイテム数(フィルター前)を制限するには Limit を設定します。返されるアイテム数は制限しません。
  • 大きなフルテーブルスキャンでは、Segment / TotalSegments でゴルーチン間に作業を分割します(並列スキャン)。
  • Query を優先しましょう。 Scan はテーブル全体を読み取ります。ごく小さいテーブル以外では遅く、コストがかかります。

Do it visually

フィルターを手作業で組み立てていますか?DynamoDB Expression BuilderFilterExpression + 名前/値のマップを構築し、実行可能なコードをコピーします。

GUI でテーブルを探索するには(フィルターされページネーションされた結果グリッド、コードとしてコピー)、スクリプトから闇雲にスキャンする代わりに DynoTable をダウンロードしてください。

References

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

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

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

DynamoDB クエリビルダーを開く

Console なしで DynamoDB を扱う

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