2015-05-03 99 views
0

我有几个猫鼬模型在我的应用程序 - 赋值,submisssion和文件。删除嵌套的对象引用mongoose

var assignmentSchema = new Schema({ 
    submissions:[{ 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'Submission' 
    }] 
}); 

var submissionSchema = new Schema({ 
    assignment: { 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'Assignment' 
    }, 
    files: [{ 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'File' 
    }], 
}) 

var fileSchema = new Schema({ 
    submission: { 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'Submission' 
    } 
}) 

我定义了一个删除挂钩的分配,因此,当一个分配是从我的MongoDB删除,提交的所有文件都被删除了。

assignmentSchema.pre('remove', function (next) { 
    var assignment = this; 

    assignment.model('Class').update(
     {_id: {$in: assignment.classes}}, 
     {$pull: {assignments: assignment._id}}, 
     {multi: true}, 
     next 
    ); 

    //will delete all submissions that were in the assignment 
    assignment.model('Submission').remove(
     {_id: {$in: assignment.submissions}}).exec(); 
     next 
}); 

它工作正常,但我也想删除所有与删除提交相关的文件。我怎样才能做到这一点?

回答

2

您必须为您的提交文档设置预删除挂钩。
然后在assignSchema循环中通过assignment.submissions数组,查找每个分配文档并对该文档执行删除操作。 这里是一个例子。未经测试。

assignmentSchema.pre('remove', function(nextAction) { 
    var assignment = this; 

    assignment.model('Class').update({ 
      _id: { 
       $in: assignment.classes 
      } 
     }, { 
      $pull: { 
       assignments: assignment._id 
      } 
     }, { 
      multi: true 
     }, 
     next 
    ); 

    Async.each(assignment.submissions, function(subId, next) { 
     submissionSchema.findById(subId).exec(function(err, submission) { 
      submission.remove(); 
      next(); 
     }) 
    }, function() { 
     nextAction(); 
    }) 
}); 



submissionSchema.pre('remove', function (next) { 
///remove files here. 
}) 
+0

工程!谢谢.. –