Mongoose更新中间件 - 需要为每个更新中间件创建挂钩吗?

时间:2018-02-02 19:35:52

标签: node.js mongodb mongoose

我们说我有以下架构:

PersonSchema = {
    name: String,
    timesUpdated: {
        type: Number,
        default: 0
    }
}

每次更新给定人员时,我都希望timesUpdated字段增加1。现在,我可以使用Mongoose的update中间件钩子,它可以通过类似

的方式调用

PersonModel.update({_id: <id>}, {name: 'new name'})

我的timesUpdated字段会适当增加。但是,如果我只为update中间件编写了一个钩子,则以下代码将更新我的timesUpdated字段:

PersonModel.updateOne({_id: <id>}, {name: 'new name'})

为了更新我的计数,我必须为udpateOne查询编写中间件。此模式会针对其他几个类似的中间件挂钩重复,例如updateManyreplaceOnesave(如果您想以这种方式更新文档),findOneAndUpdate和我&#39 ;肯定还有很多其他人。

为简单起见,我使用更新计数的示例,但我也可以使用一个示例,其中一些其他不相关的操作在更改我的名字时发生。我是否遗漏了应该如何使用钩子的东西,或者这是猫鼬钩子的限制?

2 个答案:

答案 0 :(得分:2)

预保存挂钩只能根据mongoose的中间件document执行以下功能。

  • 初始化
  • 验证
  • 保存
  • 除去

然而,更新函数直接与MongoDB一起工作,因此在所有更新函数上都没有通用的钩子。请参阅Github上的相关讨论。

答案 1 :(得分:0)

由于其他答案和问题中提到的局限性,我建议使用一个函数在所有必需的调用之前(或之后)执行您的任务,而不是一个钩子。

或者将可以调用的方法的类型限制为具有挂钩设置的方法。

或者使用总是在中间件序列中被调用的钩子,例如验证钩子。