Mongoose实现文档属性更新时自动更新lastUpdate字段
如何让Mongoose在文档更新时自动更新lastUpdate字段?
当然可以!完全不用再手动在项目各处写lastUpdate: new Date()了,Mongoose提供了两种便捷的方式来实现这个需求:
方法一:使用内置的timestamps选项(推荐)
这是最简单的方案,Mongoose的Schema支持timestamps配置项,可以直接将默认的更新时间字段映射到你现有的lastUpdate字段上:
const yourSchema = new mongoose.Schema({ // 你的其他业务字段... lastUpdate: Date }, { timestamps: { createdAt: false, // 如果你不需要自动生成创建时间,可以设为false updatedAt: 'lastUpdate' // 把Mongoose默认的updatedAt字段重命名为lastUpdate } });
配置完成后,无论是创建文档还是更新文档(比如save()、findByIdAndUpdate()、updateOne()等操作),Mongoose都会自动把lastUpdate字段设置为当前时间,完全无需手动干预。
方法二:使用预保存/预更新中间件(自定义逻辑场景)
如果你的业务有特殊需求(比如某些更新操作不需要触发时间更新,或者需要额外的判断逻辑),可以用Mongoose的pre中间件来实现:
const yourSchema = new mongoose.Schema({ lastUpdate: { type: Date, default: Date.now }, // 其他业务字段... }); // 处理文档的save操作(包括创建和手动save更新) yourSchema.pre('save', function(next) { this.lastUpdate = new Date(); next(); }); // 处理updateOne、findByIdAndUpdate、updateMany这类基于查询的更新操作 yourSchema.pre(['updateOne', 'findByIdAndUpdate', 'updateMany'], function(next) { this.set({ lastUpdate: new Date() }); next(); });
这里要注意:
pre('save')里的this指向的是文档实例,所以可以直接赋值- 对于
updateOne这类查询式更新,this指向的是查询对象,所以需要用set()方法来设置字段
内容的提问来源于stack exchange,提问作者Suhail Gulzar
相关产品推荐
相关产品推荐

