Nest.js Mongoose模型添加{ timestamps: true }后记录自动删除问题咨询
这问题确实挺奇怪的——毕竟timestamps: true本质上只是让Mongoose自动给文档添加createdAt和updatedAt字段,本身完全没有自动删除的逻辑。结合我碰到过的类似场景,给你几个优先级从高到低的排查方向:
检查数据库的TTL索引
这是最可能的原因:有没有误给用户集合设置了TTL(Time To Live)索引?比如不小心给createdAt字段加了过期时间,当你开启timestamps后,Mongoose自动生成这个字段,就会触发MongoDB的自动删除机制。
你可以用MongoDB Shell命令查看用户集合的索引:db.users.getIndexes()如果输出里有包含
expireAfterSeconds的索引,而且关联的是createdAt或者其他自动生成的时间字段,那就是它导致的,直接删除这个索引就行。排查用户模型的钩子或插件
检查你的用户Schema代码,有没有添加自定义的pre/post钩子,或者引入了第三方插件(比如软删除插件)时配置出错?比如不小心写了类似这样的错误逻辑:// 警惕这类会定时删除的钩子 userSchema.post('save', async (doc) => { setTimeout(() => doc.deleteOne(), 60000); // 1分钟后自动删除文档 });另外也要确认全局的Mongoose插件会不会影响到这个模型——比如有没有全局注册了带自动删除逻辑的插件,刚好只在用户模型上触发了。
检查应用内的定时清理任务
有没有单独的Cron任务或者服务在执行用户数据清理?比如可能写了一个每分钟运行的定时脚本,删除条件写得太宽泛(比如误把createdAt小于当前时间的文档都删了),刚好覆盖了刚创建的用户。验证Nest.js模块的特殊配置
检查用户模块的MongooseModule.forFeature配置,有没有传入异常的选项,或者使用了自定义的模型工厂,里面包含了意外的删除逻辑?
先从TTL索引和模型钩子这两点入手排查,大概率能找到问题所在。
内容的提问来源于stack exchange,提问作者Adeen Rabbani

