我会阻止任何子文档被删除,因此我在每个子文档模式的 pre('remove') 中间件中添加了一个错误。
当调用 .remove() 函数时,它有效地调用了中间件。但是当它在没有调用 remove() 的情况下被删除时,中间件不会检查它是否已被删除。
重要的情况是当我从远程源接收对象时,我想通过 mongoose 中间件执行所有完整性检查,以将所有内容保持在同一个地方。无论是否错误,远程源都可能删除了子文档之一。因此,当 Mongoose 检查整个文档时,子文档已经被删除,而没有触发 .remove() 函数。
这是我的问题的最小工作示例:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var subDateSchema = new Schema({
date_add: {type: Date, default: Date.now},
date_remove: {type: Date, default: null}
});
var ResourceSchema = new Schema({
activation_dates: [subDateSchema]
});
subDateSchema.pre('remove', function(next){
next(new Error("YOU CAN'T DELETE ANY ACTIVATION DATE"));
});
var Resource = mongoose.model('Resource', ResourceSchema);
var newresource = new Resource({
activation_dates: [{
date_add: Date.now()
}]
});
newresource.save(function(err){
if(err) throw err;
newresource.activation_dates.splice(0, 1);
/**
* Here I tried
* newresource.markModified('activation_dates');
* On update it *DOES* trigger pre save and pre validate
* But it does nothing to deleted content
**/
newresource.save(function(err){
if(err) throw err;
});
});
所以我的问题是:有没有一种干净的方法来调用子文档删除中间件,而无需继续检查所有以前的元素并与新元素进行比较以查看哪些元素被删除?