当我使用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()
时都不会调用预钩子,save
和update
预钩子对findOneAndUpdate
不起作用吗?
您需要为此使用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
字段值将被设置给用户,并将被更新。
猫鼬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 函数时