You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Golang中查询DynamoDB中一周前创建的记录?

在Golang中查询DynamoDB中一周前的字符串类型created_at记录

首先明确核心前提:你的created_at字段是字符串类型,必须使用可按字典序排序的时间格式(比如ISO 8601标准格式:YYYY-MM-DDTHH:MM:SSZ),否则无法正确完成时间范围比较。如果当前created_at格式不符合要求,需要先批量修正存量记录,且后续写入时统一使用标准格式。

正确实现步骤

  1. 计算一周前的时间,转换为与created_at完全一致的字符串格式
  2. 构造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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 09:30:16