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

Mongoose 5.12.5如何设置20天自动过期,配置不生效该如何解决?

Mongoose 5.12.5 TTL自动删除功能不生效排查方案

首先明确:Mongoose 5.12.5版本完全支持文档到期自动删除功能,该功能底层依赖MongoDB原生TTL索引,只要你使用的MongoDB服务版本≥2.2即可正常使用,无需升级Mongoose版本。

具体排查步骤

  • 检查TTL索引是否成功创建
    Mongoose默认异步创建索引,如果你之前创建过同集合的其他索引、或者关闭了autoIndex配置,会导致TTL索引没有被正确创建。
    可以在Mongo shell中执行如下命令查看当前posts集合的索引:
    db.posts.getIndexes()
    如果返回结果中没有expireAt字段对应的TTL索引,或expireAfterSeconds值不等于1728000(20天对应的秒数),可以手动删除旧索引后重启应用,或者修改代码显式声明索引:
import { Schema, model } from "mongoose";

const postSchema = new Schema(
  {
    expireAt: { type: Date, default: Date.now },
    title: { type: String, trim: true, default: null },
    imgURL: { type: String, default: null },
  },
  {
    timestamps: true,
    versionKey: false, // 注意你原有代码此处拼写错误,k需要大写
    autoIndex: true // 开发环境可开启,生产环境建议手动创建索引提升性能
  }
);
// 显式声明TTL索引,避免字段内嵌声明失效问题
postSchema.index({ expireAt: 1 }, { expireAfterSeconds: 20*24*60*60 });

export default model("Post", postSchema);
  • 检查expireAt字段值是否合法
    TTL索引只会对值为Date类型的字段生效,如果你插入文档时手动覆盖了expireAt的值为null、字符串或其他非Date类型,对应文档不会被自动删除。
  • 检查MongoDB TTL监视器状态
    MongoDB的TTL删除任务默认每60秒执行一次,到期文档最多会有60秒的删除延迟,不会精确到秒级删除。如果长时间没有删除,可以在Mongo shell中执行命令确认监视器是否开启:
    db.adminCommand({getParameter: 1, ttlMonitorEnabled: 1})
    返回结果中ttlMonitorEnabled值为true即为正常。
  • 确认集合不是固定集合(Capped Collection)
    MongoDB的固定集合不支持TTL索引删除,如果你创建posts集合时指定了capped: true配置,TTL功能会失效。
  • 集群环境排查
    如果你使用的是MongoDB副本集或分片集群,TTL删除操作仅在主节点执行后同步到从节点,请确认主节点服务运行正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 15:51:02