MongoDB:删除文档后更新子文档数组

时间:2017-03-28 22:48:12

标签: node.js mongodb express

我有一个API,我正在删除'当然'文件以下列方式:

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

这在从数据库中删除课程方面是成功的,如尝试通过id找到它时所示。

问题在于用户文档:

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

如果文档被推送到课程数组,它将在删除方法之后保留。

所以我的问题。是否有一种相对无痛的方法可以在删除后更新此文档?

感谢。

1 个答案:

答案 0 :(得分:0)

使用静态添加课程方法,删除课程及其依赖项。

假设您在courses数组中存储ID:

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

如果您要将课程文档存储在courses数组中,则需要将更新查询更改为:

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

最后在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"});
    }
};