如何在Mongoose的findOneAndUpdate前置钩子中访问更新对象?
在Mongoose 7.2.2的findOneAndUpdate pre钩子中访问并修改更新对象
你完全可以通过this.getUpdate()方法获取到传入的myUpdate对象,并且直接对其进行修改,Mongoose会使用修改后的对象执行后续的更新操作。
具体实现示例
基于你的代码,修改后的钩子可以这样写:
myschema.pre('findOneAndUpdate', function() { const query = this.getQuery(); // 获取查询条件 {_id: 'a0123'} // 获取并修改更新对象 const updateObj = this.getUpdate(); // 示例1:修改已有字段 updateObj.address = 'new address'; // 示例2:新增字段 updateObj.lastUpdated = new Date(); // 如果你的更新用了操作符(比如$set),要对应修改操作符下的字段 // 比如如果原更新是 { $set: { address: 'abc' } },就要这么改: // updateObj.$set.address = 'new address'; })
关键注意事项
- 不要用箭头函数定义钩子:箭头函数会绑定外部上下文,导致
this无法指向Mongoose的查询对象,必须使用普通函数表达式。 - 修改会直接作用于原更新对象:
getUpdate()返回的是原始更新对象的引用,修改它会直接改变后续更新使用的内容,不需要额外返回或重新设置。 - 适配更新操作符:如果你的更新语句使用了
$set、$inc等Mongoose更新操作符,需要对应修改操作符内部的字段,而不是直接修改顶层对象。
内容的提问来源于stack exchange,提问作者Abk
相关产品推荐
相关产品推荐

