You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 09:47:37