Golang使用mongo-go-driver实现MongoDB文档指定秒数后自动过期问题
问题原因
- MongoDB的TTL索引删除任务由后台专属线程执行,默认每60秒运行一次,不会在文档到期时实时删除。你的代码插入5条数据仅耗时约4秒,插入完成后立刻执行查询,此时删除线程还未运行,所有文档都未被清理。
- 若测试集合之前已存在
createdAt字段的TTL索引,Indexes().CreateOne()不会覆盖原有索引,实际生效的过期时间可能不是你设置的1秒,也会导致结果不符合预期。
修复方案
- 插入数据结束后增加足够的等待时长,确保超过TTL删除线程的运行间隔+你设置的过期时间,测试场景下建议等待90秒后再执行查询:
// 插入完成后新增等待逻辑 time.Sleep(90 * time.Second) // 再执行查询逻辑 cursor, err := col.Find(ctx, bson.M{}, nil)
- 测试前清理环境,先删除集合旧的同名索引,或者直接删除整个测试集合,避免历史配置干扰:
// 创建索引前先删除已有的createdAt索引(可选,用于规避旧索引影响) _, err = col.Indexes().DropOne(ctx, "createdAt_1") if err != nil { // 索引不存在时可以忽略错误 log.Println("旧索引不存在,跳过删除") }
- 你的结构体
NFT中CreatedAt字段的bson标签、字段类型都符合TTL索引要求,这部分无需修改。
内容的提问来源于stack exchange,提问作者yayou
相关产品推荐
相关产品推荐

