Mongoose hook“pre / post save”不适用于findOneAndUpdate

时间:2013-10-18 10:50:37

标签: node.js mongodb mongoose

我正在使用nodejs + express + mongoose。

我为模块添加“pre / post save”挂钩,它可以正常使用保存功能。 但是当我使用findOneAndUpdate(如果它不存在则创建)时,不会调用钩子。

我似乎唯一能做的就是将findOneAndUpdate分成两个函数,首先搜索项目然后再创建。

有没有更好的办法解决这个问题?

2 个答案:

答案 0 :(得分:10)

来自mongoose文档:

  

虽然在使用findAndModify帮助程序时会将值强制转换为适当的类型,但不会应用以下内容:

     
      
  • 默认
  •   
  • 制定者
  •   
  • 验证
  •   
  • 中间件
  •   
     

如果您需要这些功能,请使用首先检索文档的传统方法。

reference

更新:从Mongoose 4.0开始,您可以使用来自Changelog的runValidators选项:

  

#860:如果在update()和findOneAndUpdate()调用上创建了新文档,则可以选择运行验证器并设置默认值。要访问这些功能,必须在调用update()或findOneAndUpdate()时显式设置runValidators和setDefaultsOnInsert选项。请注意,setDefaultsOnInsert选项与MongoDB< = 2.2不兼容。进一步说明update()和findOneAndUpdate()显式运行具有空上下文的验证器(即验证器函数中的此=== null)。

答案 1 :(得分:0)

我选择了另一种方法。基本上,我所有的逻辑都在 Pre-save 中间件中。然后,当我想更新 findOneAndUpdate 中间件上的值时,我正在保存文档。这再次触发了逻辑。可能对某人有帮助。