2017-03-28 3 views
0

Ich habe eine API, in der ich ‚natürlich‘ Dokumente in der folgenden Art und Weise bin zu löschen:MongoDB: Aktualisieren von Arrays von Unter Dokumenten nach Dokumenten Löschen

module.exports.deleteCourse = function(req, res){ 
    var courseid = req.params.courseid; 
    if(courseid){ 
    Course.findByIdAndRemove(courseid, function(err, course){ 
     if(err){ 
     sendJSONResponse(res, 404, err); 
     return; 
     } 
     sendJSONResponse(res, 204, null) 
    }); 
    } else{ 
     sendJSONResponse(res, 404, {"message":"NoId"}); 
    } 
    }; 

Dies ist erfolgreich den Kurs aus der Datenbank in dem Löschen als wird angezeigt, wenn Sie versuchen, es anhand der ID zu finden.

Das Problem ist, dass in anderen Dokumenten:

var instructorSchema = new mongoose.Schema({ 
    name: {type: String, 
     unique: true, 
     required: true}, 
    password: {type: String, 
      required: true}, 
    courses: [course.schema] 
}); 

Wenn das Dokument an den Kursen Array geschoben wurde es nach der Löschmethode bleibt.

Also meine Frage. Gibt es eine relativ schmerzfreie Möglichkeit, dieses Dokument nach dem Löschen zu aktualisieren?

Danke.

Antwort

0

Fügen Sie eine Klassenmethode für Kurs mit Statik hinzu, in der Sie den Kurs und seine Abhängigkeiten löschen.

Angenommen, Sie ids in courses Array Speicherung:

var Instructor = require('./instructor'); 

courseSchema.statics = { 
    removeOneWithDependencies : function(id, done){ 
     this.findByIdAndRemove(id, function(err, course){ 
      if(err){ 
       return done(err); 
      } 
      else{ 
       //Removes the course id from courses array of all instructor docs 
       Instructor.update({courses: course._id}, { $pullAll: {courses: [course._id] } }, {multi: true}, function(err){ //http://stackoverflow.com/a/27917378/ 
        if(err){ 
         return done(err); 
        } 
        else{ 
         return done(); 
        } 
       }) 
      } 
     }); 
    } 
} 

Falls Sie speichern Kursunterlagen in courses Array müssen Sie die Update-Abfrage ändern:

Instructor.update({"courses._id": course._id}, { $pull: {courses:{_id: course._id} } }, {multi: true}, function(err){ //http://stackoverflow.com/a/15122017/ 

schließlich die oben verwenden Methode in Ihrer API:

module.exports.deleteCourse = function(req, res){ 
    var courseid = req.params.courseid; 
    if(courseid){ 
     Course.removeOneWithDependencies(courseid, function(err){ 
      if(err){ 
       return sendJSONResponse(res, 500, err); 
      } 
      else{ 
       return sendJSONResponse(res, 204, null); 
      } 
     }); 
    } else{ 
     sendJSONResponse(res, 404, {"message":"NoId"}); 
    } 
}; 
Verwandte Themen