我正在使用nodejs + express + mongoose。
我为模块添加“pre / post save”挂钩,它可以正常使用保存功能。 但是当我使用findOneAndUpdate(如果它不存在则创建)时,不会调用钩子。
我似乎唯一能做的就是将findOneAndUpdate分成两个函数,首先搜索项目然后再创建。
有没有更好的办法解决这个问题?
答案 0 :(得分:10)
来自mongoose文档:
虽然在使用findAndModify帮助程序时会将值强制转换为适当的类型,但不会应用以下内容:
- 默认
- 制定者
- 验证
- 中间件
如果您需要这些功能,请使用首先检索文档的传统方法。
更新:从Mongoose 4.0开始,您可以使用来自Changelog的runValidators
选项:
#860:如果在update()和findOneAndUpdate()调用上创建了新文档,则可以选择运行验证器并设置默认值。要访问这些功能,必须在调用update()或findOneAndUpdate()时显式设置runValidators和setDefaultsOnInsert选项。请注意,setDefaultsOnInsert选项与MongoDB< = 2.2不兼容。进一步说明update()和findOneAndUpdate()显式运行具有空上下文的验证器(即验证器函数中的此=== null)。
答案 1 :(得分:0)
我选择了另一种方法。基本上,我所有的逻辑都在 Pre-save 中间件中。然后,当我想更新 findOneAndUpdate 中间件上的值时,我正在保存文档。这再次触发了逻辑。可能对某人有帮助。