当我使用Model.findOneAndUpdate时,不会调用用于保存和更新的猫鼬预钩子

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当我使用Model.findOneAndUpdate时,不会调用用于保存和更新的猫鼬预钩子相关的知识,希望对你有一定的参考价值。

我用猫鼬创建了一个快速应用程序。我还创建了一个保存和更新钩子,如下所示:

userSchema.pre("update", async function save(next) {
    console.log("inside update")
     });

userSchema.pre("update", async function save(next) {
    console.log("inside save")
     });

但是任何时候我调用Model.findOneAndUpdate()时都不会调用预钩子,saveupdate预钩子对findOneAndUpdate不起作用吗?

答案
如猫鼬docs中所述,在update(),findOneAndUpdate()上不执行前后save()挂钩。

您需要为此使用findOneAndUpdate钩子。但是您无法访问将使用此关键字更新的文档。如果需要访问将要更新的文档,则需要对文档执行显式查询。

userSchema.pre("findOneAndUpdate", async function() { console.log("I am working"); const docToUpdate = await this.model.findOne(this.getQuery()); console.log(docToUpdate); // The document that `findOneAndUpdate()` will modify });

或者如果您可以使用this.set()这样设置字段值:

userSchema.pre("findOneAndUpdate", async function() { console.log("I am working"); this.set({ updatedAt: new Date() }); });

假设我们拥有此用户架构:

const mongoose = require("mongoose"); const userSchema = new mongoose.Schema({ name: String, updatedAt: { type: Date, default: Date.now() } }); userSchema.pre("findOneAndUpdate", async function() { console.log("I am working"); this.set({ updatedAt: new Date() }); }); module.exports = mongoose.model("User", userSchema);

以及此用户文档:

{ "updatedAt": "2020-01-30T19:48:46.207Z", "_id": "5e33332ba7c5ee3b98ec6efb", "name": "User 1", "__v": 0 }

当我们像这样更新此用户名时:

router.put("/users/:id", async (req, res) => { let result = await User.findOneAndUpdate( { _id: req.params.id }, { name: req.body.name }, { new: true } ); res.send(result); });

updatedAt字段值将被设置给用户,并将被更新。
另一答案
pre和post save()钩子不会在update(),findOneAndUpdate()等上执行。您可以在此Github issue中找到更详细的讨论原因,>

猫鼬4.0为这些功能引入了不同的钩子。

userSchema.pre('find', function() { console.log(this instanceof mongoose.Query); // true }); userSchema.post('find', function(result) { console.log(this instanceof mongoose.Query); // true });

以上是关于当我使用Model.findOneAndUpdate时,不会调用用于保存和更新的猫鼬预钩子的主要内容,如果未能解决你的问题,请参考以下文章

为啥在我的 c 程序中,当我使用 double 时它只输出 0,但是当我使用 float 时它可以工作? [复制]

当我访问我的 iframe 时,当我使用 selenium 时,#document 不显示

当我在 ngOnInit() 中使用 router.getCurrentNavigation() 时,它会给我类型错误,但是当我在构造函数中使用它时,它工作正常,为啥?

当我不知道 data.frame 中的列名时,当我使用 dplyr mutate 函数时

Cordova/Phonegap - 当我关闭应用程序时存储一个数组(当我重新打开时使用它们)

为啥当我解构属性时接收道具的组件不起作用,但是当我使用 props.key 时它起作用了?