DynamoDB Scan di Go (AWS SDK v2)
Scan membaca setiap item dalam sebuah tabel atau index, halaman demi halaman, lalu secara opsional membuang baris dengan FilterExpression. Di AWS SDK for Go v2, ScanPaginator bawaan mengikuti LastEvaluatedKey hingga seluruh tabel terbaca.
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))
}Penjelasan
FilterExpression— diterapkan setelah pembacaan, di server. Ia mengecilkan response tetapi bukan biayanya: Anda membayar untuk membaca setiap item yang di-scan, terfilter atau tidak.ExpressionAttributeNames— atribut yang difilter diberi alias (#filter0→Year), yang menjaga reserved word sepertiYeartetap aman.- Paginasi — setiap halaman
Scanmembaca paling banyak 1 MB sebelum pemfilteran, jadi halaman yang difilter bisa kembali kosong sementara tabel masih memiliki kecocokan.dynamodb.NewScanPaginatorterus memanggil hinggaLastEvaluatedKeyhabis — jangan pernah berhenti di halaman pertama. - Set
Limituntuk membatasi item yang di-scan per halaman (pra-filter) — ia tidak membatasi item yang dikembalikan. - Untuk scan seluruh tabel yang besar, bagi pekerjaan antar goroutine dengan
Segment/TotalSegments(sebuah parallel scan). - Lebih baik gunakan
Query.Scanmembaca seluruh tabel; pada apa pun selain tabel yang sangat kecil, ia lambat dan mahal.
Lakukan secara visual
Menyusun filter dengan tangan? DynamoDB Expression Builder membangun FilterExpression + map name/value dan menyalin kode yang bisa dijalankan.
Untuk menjelajahi tabel di GUI — dengan grid hasil yang terfilter dan berpaginasi serta copy-as-code — unduh DynoTable, alih-alih scan membabi buta dari sebuah script.
Contoh terkait
- DynamoDB Scan di Java — scan yang sama dengan AWS SDK for Java 2.x.
- DynamoDB Query di Go — pembacaan yang lebih murah yang biasanya harus Anda pilih.
- Query vs. Scan — kapan (jarang) sebuah
Scandibenarkan. - Mengapa DynamoDB Scan saya lambat dan mahal? — model biaya dan cara menghindarinya.
- DynamoDB ProvisionedThroughputExceededException — apa yang dilakukan scan seluruh tabel terhadap kapasitas tabel provisioned.
- DynamoDB ThrottlingException — throttle lainnya, dan bagaimana exponential backoff menanganinya.
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
Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.