MongoDB TTL索引文档未按时删除:设5分钟却2分钟被删除求助
问题分析与解决方案
核心问题
文档提前被删除的根源是created_at字段的默认值设置错误:
default: new Date()
new Date()在Schema定义阶段就会执行一次,固定为Schema加载的时间,而非文档实际创建的时间。比如服务启动3分钟后创建文档,该文档的created_at会是3分钟前的时间,TTL索引从这个固定时间开始计算5分钟有效期,导致文档在创建后仅2分钟就被删除,和你描述的现象完全吻合。
另外,你重复定义了TTL索引:字段内的expires: "5m"与单独调用的index({ created_at: 1 }, { expireAfterSeconds: 300 })作用完全一致,属于冗余配置,建议只保留一种写法。
修正后的Schema代码
const hospitalRecordSchema = new mongoose.Schema({ hospital_id: { type: String, }, hospital_name: { type: String, }, created_at: { type: Date, // 改为函数形式,每次创建文档时生成当前时间 default: Date.now, expires: "5m", index: true, }, data: { type: Object, default: {}, }, }); // 移除重复的索引定义,或保留此句并删除字段内的expires,二者选其一即可 // hospitalRecordSchema.index({ created_at: 1 }, { expireAfterSeconds: 300 }); module.exports = mongoose.model("HospitalRecord", hospitalRecordSchema);
验证步骤
- 修改代码后重启服务,确保新Schema生效。
- 创建新文档后,检查
created_at字段值,确认是文档创建的当前时间。 - 等待5分钟,验证文档是否在预期时间被自动删除。
内容的提问来源于stack exchange,提问作者Sami Malik
相关产品推荐
相关产品推荐

