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