Как указано в пн goose документы Перехваты pre и post save () не выполняются при update () и findOneAndUpdate ().
Вам необходимо использовать findOneAndUpdate
hook за это. Но вы не можете получить доступ к документу, который будет обновляться с использованием этого ключевого слова. Если вам нужен доступ к документу, который будет обновлен, вам нужно выполнить явный запрос для документа.
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
будет установлено для пользователя и будет обновлено.