サブドキュメントが削除されないようにするため、各サブドキュメントスキーマの pre('remove') ミドルウェアにエラーを追加しました。
.remove() 関数を呼び出すと、効果的にミドルウェアが呼び出されます。ただし、remove() を呼び出さずに削除すると、ミドルウェアは削除されたかどうかを確認しません。
問題になるのは、リモート ソースからオブジェクトを受け取るときです。マングース ミドルウェアを介してすべての整合性チェックを実行し、すべてを同じ場所に保持したいと考えています。リモート ソースは、間違っているかどうかにかかわらず、サブ ドキュメントの 1 つを削除している可能性があります。そのため、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;
});
});
私の質問は次のとおりです。以前のすべての要素をチェックし、新しい要素と比較して削除されている要素を確認することなく、ミドルウェアを削除するサブドキュメントを呼び出すクリーンな方法はありますか?