删除一个和一个很多的参考 – mongoose

我有一个Assignment schema ,它具有对GroupsProjects引用。

 Assignment == Group [One-One Relationship] Assignment == Projects [One-Many Relationship] 

以下是我的Asssignment模式

 var AssignmentSchema = new Schema({ name: String, group: { type: Schema.Types.ObjectId, ref: 'Group' }, projects: [{type: mongoose.Schema.Types.ObjectId, ref: 'Project'}], }); 

如果一个Group/Project被删除,我如何更新我的分配模式。

 var ProjectSchema = new Schema({ name: String }); var GroupSchema = new Schema({ name: String }); 

从几个在stackoverflow中的答案,我来了解删除中间件,但我不知道如何实现它one-one and one-many关系。 任何人都可以告诉我一个这样做的例子。

 ProjectSchema.pre('remove', function(next){ this.model('Assignment').update( ); }); 

关系:

  1. one-to-one is a relationship是一个国家只有一个首都,一个首都是一个国家的首都
  2. one-to-many is a relationship母亲有很多孩子的关系,孩子只有一个母亲
  3. many-to-many is a relationship ,一本书可以由几个作者或共同作者编写,而一个作者可以写几本书。

一对一的关系 – 如果Project/Group被删除,我如何更新我的Assignment模式。

通常情况下,您将有一个project映射到一个assignment ,同样,一个assignment映射到一个project 。 你可以在这里做的是删除一个项目,然后在赋值模型中find相关的project ,并删除它们的引用。

 delete: function(req, res) { return Project.findById(req.params.id, function(err, project){ return project.remove(function(err){ if(!err) { Assignment.update({_id: project.assignment}}, {$pull: {projects: project._id}}, function (err, numberAffected) { console.log(numberAffected); } else { console.log(err); } }); }); }); } 

一对多的关系 – 如果一个Project/Group被删除,我如何更新我的Assignment模式。

在这种情况下,我们将删除一个项目,然后查找属于该project所有assignments ,并从中删除其引用。 在这种情况下,一个项目可以有很多任务。

 delete: function(req, res) { return Project.findById(req.params.id, function(err, project){ return project.remove(function(err){ if(!err) { Assignment.update({_id: {$in: project.assingments}}, {$pull: {project: project._id}}, function (err, numberAffected) { console.log(numberAffected); } else { console.log(err); } }); }); }); } 

删除中间件

你可以像Johnny指出的那样通过middleware来实现同样的事情,只是对其进行更正。

 ProjectSchema.pre('remove', function (next) { var project = this; project.model('Assignment').update( { projects: {$in: project.assignments}}, { $pull: { project: project._id } }, { multi: true }, next ); }); 

通常可以有许多属于一个assignment projects和许多属于同一个project 。 您将在Project Schema中有一个assignment列,其中一个项目将与多个分配相关联。

注意:删除中间件不适用于模型,只能在您的文档上运行。 如果你正在使用remove中间件来确保你的删除function,你首先findid project ,然后在返回的document应用remove方法,所以为了上面的工作…你的删除function看起来像这样。

 delete: function(req, res) { return Project.findById(req.params.id, function(err, project){ return project.remove(function(err){ if(!err) { console.log(numberAffected); } }); }); } 

remove 中间件时 ,您需要定义在通过Model#remove该模式的模型文档时要执行的操作。 所以:

  • 当一个组被删除时,你想从所有的赋值文档中删除该组的_id group引用。
  • 当一个项目被移除时,你想从所有的赋值文档中去除该projects_idprojects数组元素引用。

你可以实现如下:

 GroupSchema.pre('remove', function(next) { var group = this; group.model('Assignment').update( { group: group._id }, { $unset: { group: 1 } }, { multi: true }, next); }); ProjectSchema.pre('remove', function (next) { var project = this; project.model('Assignment').update( { projects: project._id }, { $pull: { projects: project._id } }, { multi: true }, next); });