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

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);

验证步骤

  1. 修改代码后重启服务,确保新Schema生效。
  2. 创建新文档后,检查created_at字段值,确认是文档创建的当前时间。
  3. 等待5分钟,验证文档是否在预期时间被自动删除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 23:41:11