MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Dokument podrzędny Mongoose przed usunięciem oprogramowania pośredniczącego, które nie jest wywoływane

Po krótkich poszukiwaniach znalazłem to:

Obejściem może być podpięcie zdarzenia do całej tablicy dokumentów podrzędnych i posiadanie kopii poprzedniej tablicy danych.

To jest kompletny działający przykład, jak upewnić się, że element tablicy nie został usunięty ani wyciągnięty . Aby sprawdzić modyfikacje, będziesz potrzebować dalszych modyfikacji.

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

Niestety nie mogłem znaleźć innego rozwiązania niż wykonanie pętli nad wszystkimi elementami i pobranie oryginalnego dokumentu.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB listCollections filter

  2. Konwersja BSON do JSON przy użyciu MongoDB Driver Java API

  3. Sprawdź stan działania mapy MongoDB redukuj zadania

  4. mongo:zwrot nie jest równy count()

  5. Jak uzyskać dostęp do instancji MongoDB 4.2?