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

Golang使用mongo-go-driver实现MongoDB文档指定秒数后自动过期问题

问题原因

  • MongoDB的TTL索引删除任务由后台专属线程执行,默认每60秒运行一次,不会在文档到期时实时删除。你的代码插入5条数据仅耗时约4秒,插入完成后立刻执行查询,此时删除线程还未运行,所有文档都未被清理。
  • 若测试集合之前已存在createdAt字段的TTL索引,Indexes().CreateOne()不会覆盖原有索引,实际生效的过期时间可能不是你设置的1秒,也会导致结果不符合预期。

修复方案

  1. 插入数据结束后增加足够的等待时长,确保超过TTL删除线程的运行间隔+你设置的过期时间,测试场景下建议等待90秒后再执行查询:
// 插入完成后新增等待逻辑
time.Sleep(90 * time.Second)

// 再执行查询逻辑
cursor, err := col.Find(ctx, bson.M{}, nil)
  1. 测试前清理环境,先删除集合旧的同名索引,或者直接删除整个测试集合,避免历史配置干扰:
// 创建索引前先删除已有的createdAt索引(可选,用于规避旧索引影响)
_, err = col.Indexes().DropOne(ctx, "createdAt_1")
if err != nil {
    // 索引不存在时可以忽略错误
    log.Println("旧索引不存在,跳过删除")
}
  1. 你的结构体NFT中CreatedAt字段的bson标签、字段类型都符合TTL索引要求,这部分无需修改。

内容的提问来源于stack exchange,提问作者yayou

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:18:04