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))
}

说明

  • FilterExpression — 在服务端于读取之后应用。它缩小的是响应,而成本:无论是否被过滤,你都要为扫描的每个项目的读取付费。
  • ExpressionAttributeNames — 被过滤的属性做了别名(#filter0Year),这能让像 Year 这样的保留字保持安全。
  • 分页 — 每个 Scan 页在过滤 之前 最多读取 1 MB,因此当表中仍有匹配时,一个被过滤的页也可能返回为空。dynamodb.NewScanPaginator 会不断调用直到 LastEvaluatedKey 被耗尽——绝不要在第一页就停下。
  • 设置 Limit 可限制每页扫描(过滤前)的项目数——它不会限制返回的项目数。
  • 对于大型全表扫描,用 Segment / TotalSegments 把工作拆分到多个 goroutine(一次并行扫描)。
  • 优先用 Query Scan 会读取整张表;除了很小的表以外,它又慢又贵。

可视化操作

手工拼装过滤器?DynamoDB Expression Builder 会构建 FilterExpression + 名称/值映射并复制可运行代码。

想在 GUI 中探索表——带过滤、分页的结果网格和复制为代码——请下载 DynoTable,而不是从脚本里盲目扫描。

相关示例

References

Last verified 2026-07-13 against the official AWS documentation linked above.

可视化构建此请求

在免费的 DynamoDB 查询构建器中组装此操作 —— 键条件、筛选、索引、Limit、排序方向和分页循环 —— 再把它作为可运行的 SDK v3、CLI 或 boto3 程序复制回来。

打开 DynamoDB 查询构建器

无需控制台即可使用 DynamoDB

DynoTable 是面向 DynamoDB 的快速桌面客户端 —— 浏览表、运行 SQL 风格的查询,并在本地编辑项。