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
相关产品推荐
相关产品推荐

