MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Поддокумент на Mongoose преди премахване на междинен софтуер не е извикан

След малко проучване открих това:

Заобиколно решение може да бъде да свържете събитие към целия масив от поддокументи и да имате копие на предишния масив от данни.

Това е пълен работещ пример за това как да сте сигурни, че елемент от масив не е изтрит или изтеглен . За да проверите за модификации, ще ви трябват допълнителни модификации.

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;
    });
});

За съжаление не можах да намеря друго решение освен да направя цикъл върху всички елементи и да извлека оригиналния документ.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да филтрирате масив в поддокумент с MongoDB

  2. Не можете да стартирате logstash с помощта на конфигурацията на mongoDB?

  3. Mongoid Query DB чрез виртуален атрибут

  4. Най-ефективният начин за съхраняване на вложени категории (или йерархични данни) в Mongo?

  5. Как да конфигурирате нов порт за mongodb