Na een beetje onderzoek vond ik dit:
Een tijdelijke oplossing kan zijn om een gebeurtenis aan de hele reeks subdocumenten te koppelen en een kopie te hebben van de vorige reeks gegevens.
Dit is een volledig werkend voorbeeld om er zeker van te zijn dat een array-element niet verwijderd of verwijderd is . Om te controleren op wijzigingen, heeft u verdere wijzigingen nodig.
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ResourceSchema = new Schema({
activation_dates: [subDateSchema]
});
// This virtual permits to store the original array accross the middlewares
ResourceSchema.virtual("original").set(function(item){
this._original = item;
}).get(function(){
return this._original;
});
// This middleware checks for a previous version of the "Resource"
ResourceSchema.pre("validate", function(next){
var self = this;
mongoose.model("Resource").findById(this._id, function(err, doc){
if(err) throw err;
self.original = doc;
next();
});
});
// This validation block checks for any modification of the array of sub documents
ResourceSchema.path("activation_dates").validate(function(value){
var j;
if(this.original){
// if the new array is smaller than the original, no need to go further
if(this.original.activation_dates.length > value.length){
return false;
}
for(var i=0; i < this.original.activation_dates.length; i++){
j=0;
// if the array element has been deleted but not pulled out, we need to check it
if(typeof value[j] == "undefined" || typeof value[j]._id == "undefined"){
return false;
}
while(value.length > j && this.original.activation_dates[i]._id.toString() != value[j]._id.toString()){
j++;
}
if(j == value.length){
return false;
}
}
}
return true;
}, "You deleted at least one element of the array");
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);
// OR:
//delete newresource.activation_dates[0];
// this line is essential in the case you *delete* but not pull out
newresource.markModified('activation_dates');
newresource.save(function(err){
if(err) throw err;
});
});
Helaas kon ik geen andere oplossing vinden dan een lus te maken over alle elementen en het originele document op te halen.