mongoose中间件更新前
我在用
schema.pre('save', function (next) { if (this.isModified('field')) { //do something } });
但我现在需要在schema.pre('update'
钩子,但它不存在。
根据这个不可能:
查询中间件与文档中间件有着微妙而重要的区别:在文档中间件中,这是指正在更新的文档。 在查询中间件中,mongoose不一定具有对被更新文档的引用,所以这是指查询对象而不是被更新的文档。
update
是查询中间件, this
是指没有isModified
方法的查询对象。
@杰里米我已经到了相同的问题,并最终得到一个解决方法:
schema.pre('update', function(next) { const modifiedField = this.getUpdate().$set.field; if (!modifiedField) { return next(); } try { const newFiedValue = // do whatever... this.getUpdate().$set.field = newFieldValue; next(); } catch (error) { return next(error); } });
采取从这里: https : //github.com/Automattic/mongoose/issues/4575
有了这个,你可以检查是否有任何更新的字段,但你不能检查传入值是否不同于存储。 它适用于我的使用情况(复位后encryption密码)
我希望它有帮助。
我最近遇到这个githubpost,发现了一个工作更新。 在这里。
schema.pre('findOneAndUpdate', function() { this.findOneAndUpdate({}, { $set: { updatedAt: new Date() } }); });