DynamoDB Scan en Go (AWS SDK v2)

Scan lee todos los items de una tabla o índice, página a página, y luego descarta filas opcionalmente con un FilterExpression. En AWS SDK para Go v2 el ScanPaginator integrado sigue LastEvaluatedKey hasta que se lee toda la tabla.

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

Explicación

  • FilterExpression — se aplica después de la lectura, en el servidor. Reduce la respuesta pero no el coste: pagas por leer todos los items escaneados, filtrados o no.
  • ExpressionAttributeNames — el atributo filtrado lleva un alias (#filter0Year), lo que mantiene a salvo palabras reservadas como Year.
  • Paginación — cada página de Scan lee como máximo 1 MB antes de filtrar, así que una página filtrada puede volver vacía mientras la tabla aún tiene coincidencias. dynamodb.NewScanPaginator sigue llamando hasta agotar LastEvaluatedKey — nunca te pares en la primera página.
  • Pon Limit para limitar los items escaneados por página (antes del filtro) — no limita los items devueltos.
  • Para un scan grande de la tabla completa, reparte el trabajo entre goroutines con Segment / TotalSegments (un scan en paralelo).
  • Prefiere Query. Scan lee toda la tabla; en cualquier cosa que no sea una tabla diminuta es lento y caro.

Hazlo visualmente

¿Montando un filtro a mano? El DynamoDB Expression Builder construye el FilterExpression + los mapas de nombres/valores y copia código ejecutable.

Para explorar tablas en una interfaz gráfica — con cuadrículas de resultados filtradas y paginadas y copiar como código — descarga DynoTable, en lugar de escanear a ciegas desde un script.

Ejemplos relacionados

References

Verificado por última vez el 2026-07-13 contra la documentación oficial de AWS enlazada arriba.

Construye esta solicitud visualmente

Compón esta operación en el Generador de consultas de DynamoDB gratuito —condición de clave, filtro, índice, Limit, orden de clasificación y un bucle de paginación— y cópiala de vuelta como un programa ejecutable para SDK v3, CLI o boto3.

Abrir el Generador de consultas de DynamoDB

Trabaja con DynamoDB sin la Consola

DynoTable es un cliente de escritorio rápido para DynamoDB: explora tablas, ejecuta consultas estilo SQL y edita Items localmente.