我对此问题有些困惑。 我已经阅读了所有有关中间件的猫鼬文档和一些stackoverflow问题,并且无法找到如何解决我的问题而又不重复查询(先查找再删除)。
通常,从Model而不是从文档调用时,在remove上的中间件不会触发。但是根据the doc,如果我添加{query:true},则会从模型查询中调用我的函数。
我使用最新的猫鼬版本(5.4.16)
这是我的代码。
let mySchema= new mongoose.Schema({
name: String,
comment: String
}, { usePushEach: true });
mySchema.pre('remove', { document: true }, function() {
console.log('remove document');
});
mySchema.pre('remove', { query: true }, function() {
console.log('remove');
});
const MyModel = mongoose.model('MyModel', mySchema);
这里的电话
MyModel.deleteOne({ _id: modelId }, (errorRm) => {
if (errorRm) {
return res.json({ success: false, message: `${errorRm.message}` });
}
return res.json({ success: true, message: 'Model successfully removed' });
});
该模型已成功删除,但是“ pre”功能未记录任何内容...
任何帮助都将受到欢迎。
答案 0 :(得分:0)
这是因为您正在使用 MyModel.deleteOne()。使用 MyModel.remove(),它将起作用。
根据文档:
您可以将选项传递给Schema.pre()和Schema.post()来切换Mongoose是调用Document.remove()还是Model.remove()的remove()钩子: