如何修改MongoDB Schema实现记录创建3600秒后自动删除
Mongoose实现记录创建3600秒后自动删除方案
实现逻辑
MongoDB原生提供TTL(生存时间)索引能力,可基于日期类型字段自动过期删除过期文档,无需业务层编写定时清理任务。你现有Schema已经定义了记录创建时间的createdAt字段,只需给该字段配置TTL索引即可满足需求,同时需要修复原代码中createdAt默认值的写法bug。
修改后的完整Schema代码
const verifyModel = mongoose.Schema( { userId:{ type:Schema.Types.ObjectId, required:true, ref:"User", unique:true, }, token:{ type:String, required:true, }, createdAt:{ type:Date, // 修复原代码bug:去掉Date.now后的括号,传入函数引用,保证每次新建文档时才生成当前时间 default: Date.now, // 配置TTL索引,文档创建满3600秒后自动过期,也可直接写expires: 3600,默认单位为秒 index: { expires: '3600s' } }, } );
配置注意事项
- TTL索引的清理任务是MongoDB后台周期性执行的,默认每60秒扫描一次待删除文档,因此实际删除时间可能比设定的3600秒有0-60秒的延迟,属于官方设计的正常表现。
- 如果修改代码前该集合已经创建过非TTL版本的
createdAt索引,需要先删除旧索引再重启服务,否则TTL索引会因为冲突无法生效。 - TTL索引仅支持对BSON日期类型的字段生效,当前
createdAt字段配置为Date类型,符合索引创建要求。 - 如果后续需要调整过期时长,直接修改
expires对应的时间值即可,修改后会同步更新索引配置。
内容的提问来源于stack exchange,提问作者Chirag Mittal
相关产品推荐
相关产品推荐

