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

Posted

技术标签:

【中文标题】Mongoose 更新中间件 - 需要为每个更新中间件创建挂钩?【英文标题】:Mongoose update middleware - need to create hooks for every single update middleware? 【发布时间】:2018-07-13 08:54:16 【问题描述】:

假设我有以下架构:

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

每次更新给定的人时,我都希望timesUpdated 字段增加一。现在,我可以使用 Mongoose 的 update 中间件钩子,它会被类似的东西调用

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

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

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

为了更新我的计数,我必须为udpateOne 查询编写中间件。这种模式重复用于其他几个类似的中间件挂钩,例如updateManyreplaceOnesave(如果您想以这种方式更新文档)、findOneAndUpdate,我相信还有很多其他的。

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

【问题讨论】:

【参考方案1】:

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

或者也许将可以调用的方法类型限制为设置了钩子的方法。

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

【讨论】:

【参考方案2】:

根据猫鼬的中间件document,只有以下函数才会执行预保存钩子。

初始化 验证 保存 移除

但是更新函数直接与 MongoDB 一起工作,因此没有通用的钩子适用于所有更新函数。相关讨论见Github。

【讨论】:

以上是关于Mongoose 更新中间件 - 需要为每个更新中间件创建挂钩?的主要内容,如果未能解决你的问题,请参考以下文章

跳过 Mongoose 中某些更新的时间戳中间件

我可以从 post save 中间件执行 mongoose 更新吗?

Mongoose Stream,如何更新每个文档?

SetTimeout 在 Mongoose 模式后中间件中不起作用

更新 mongoose 子文档会修改原始模式

更新 mongoose 子文档会修改原始模式