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— 被过滤的属性做了别名(#filter0→Year),这能让像Year这样的保留字保持安全。- 分页 — 每个
Scan页在过滤 之前 最多读取 1 MB,因此当表中仍有匹配时,一个被过滤的页也可能返回为空。dynamodb.NewScanPaginator会不断调用直到LastEvaluatedKey被耗尽——绝不要在第一页就停下。 - 设置
Limit可限制每页扫描(过滤前)的项目数——它不会限制返回的项目数。 - 对于大型全表扫描,用
Segment/TotalSegments把工作拆分到多个 goroutine(一次并行扫描)。 - 优先用
Query。Scan会读取整张表;除了很小的表以外,它又慢又贵。
可视化操作
手工拼装过滤器?DynamoDB Expression Builder 会构建 FilterExpression + 名称/值映射并复制可运行代码。
想在 GUI 中探索表——带过滤、分页的结果网格和复制为代码——请下载 DynoTable,而不是从脚本里盲目扫描。
相关示例
- Java 中的 DynamoDB Scan — 用 AWS SDK for Java 2.x 完成同样的扫描。
- Go 中的 DynamoDB Query — 你通常应该选择的更便宜的读取。
- Query vs. Scan — 何时(很少)
Scan是合理的。 - 为什么我的 DynamoDB Scan 又慢又贵? — 成本模型以及如何避免。
- DynamoDB ProvisionedThroughputExceededException — 全表扫描对预置表的容量有何影响。
- DynamoDB ThrottlingException — 另一种限流,以及指数退避如何应对它。
References
- Scan — Amazon DynamoDB API Reference
- Use Scan with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- dynamodb package — AWS SDK for Go v2 (pkg.go.dev)
- dynamodb/types package — AWS SDK for Go v2 (pkg.go.dev)
- Scanning tables — Amazon DynamoDB Developer Guide
Last verified 2026-07-13 against the official AWS documentation linked above.