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
查询编写中间件。这种模式重复用于其他几个类似的中间件挂钩,例如updateMany
、replaceOne
、save
(如果您想以这种方式更新文档)、findOneAndUpdate
,我相信还有很多其他的。
为了简单起见,我使用更新计数的示例,但我也可以使用在更改我的姓名时发生其他一些不相关操作的示例。我是否遗漏了应该如何使用钩子的东西,或者这是猫鼬钩子的限制?
【问题讨论】:
【参考方案1】:由于其他答案和问题中提到的限制,我建议在所有必需的调用(更新或 updateOne)之前/之后使用一个函数来执行您的任务,而不是一个钩子。
或者也许将可以调用的方法类型限制为设置了钩子的方法。
或者使用一个总是在中间件序列中被调用的钩子,比如一个验证钩子。
【讨论】:
【参考方案2】:根据猫鼬的中间件document,只有以下函数才会执行预保存钩子。
初始化 验证 保存 移除但是更新函数直接与 MongoDB 一起工作,因此没有通用的钩子适用于所有更新函数。相关讨论见Github。
【讨论】:
以上是关于Mongoose 更新中间件 - 需要为每个更新中间件创建挂钩?的主要内容,如果未能解决你的问题,请参考以下文章
我可以从 post save 中间件执行 mongoose 更新吗?