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() } }); });