如何在Golang中查询DynamoDB中一周前创建的记录?
在Golang中查询DynamoDB中一周前的字符串类型
created_at记录 首先明确核心前提:你的created_at字段是字符串类型,必须使用可按字典序排序的时间格式(比如ISO 8601标准格式:YYYY-MM-DDTHH:MM:SSZ),否则无法正确完成时间范围比较。如果当前created_at格式不符合要求,需要先批量修正存量记录,且后续写入时统一使用标准格式。
正确实现步骤
- 计算一周前的时间,转换为与
created_at完全一致的字符串格式 - 构造DynamoDB查询请求(优先用
Query,依赖索引获得高性能;无合适索引时再用Scan)
完整可运行代码示例
package main import ( "context" "fmt" "time" "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() { // 加载AWS配置,替换为你的区域 cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("us-east-1")) if err != nil { panic(fmt.Errorf("加载SDK配置失败: %v", err)) } client := dynamodb.NewFromConfig(cfg) // 计算一周前的UTC时间,转为ISO 8601字符串(和你的created_at格式保持一致) oneWeekAgo := time.Now().UTC().AddDate(0, 0, -7).Format(time.RFC3339) // 构造Query请求(如果有以created_at为排序键的GSI,指定IndexName可大幅提升性能) params := &dynamodb.QueryInput{ TableName: aws.String("你的表名"), // 替换为你的表名 // IndexName: aws.String("created_at-index"), // 可选:指定对应的全局二级索引 FilterExpression: aws.String("#createdAt >= :weekAgo"), ExpressionAttributeNames: map[string]string{ "#createdAt": "created_at", // 字段别名,避免与DynamoDB关键字冲突 }, ExpressionAttributeValues: map[string]types.AttributeValue{ ":weekAgo": &types.AttributeValueMemberS{Value: oneWeekAgo}, // 字符串类型字段必须用S类型值 }, } // 发送查询请求 resp, err := client.Query(context.TODO(), params) if err != nil { panic(fmt.Errorf("查询数据失败: %v", err)) } // 处理查询结果 fmt.Printf("找到 %d 条符合条件的记录\n", len(resp.Items)) for _, item := range resp.Items { if createdAtVal, ok := item["created_at"].(*types.AttributeValueMemberS); ok { fmt.Println("记录创建时间:", createdAtVal.Value) } } }
你原代码的问题修正点
- 错误地将字符串类型的
created_at按数字类型(N)传值,必须改用S类型的AttributeValueMemberS ExpressionAttributeNames的写法冗余:"#createdAt": *aws.String("created_at")无需解引用,直接传入字符串即可- 末尾的
filterCondition属于错误用法,DynamoDB Go SDK v2无需这种方式构造条件,直接在QueryInput/ScanInput中指定表达式即可
关键注意事项
- 若
created_at不是可排序的标准格式,时间比较逻辑会完全失效,必须先统一格式 - 绝对优先使用
Query而非Scan:Scan会全表扫描,性能极低;无合适索引时建议创建以created_at为排序键的全局二级索引(GSI) - 时间计算建议使用UTC时区,避免不同时区带来的时间偏差
内容的提问来源于stack exchange,提问作者kernelpanic
相关产品推荐
相关产品推荐

