删除一个和一个很多的参考 – mongoose
我有一个Assignment schema
,它具有对Groups
和Projects
引用。
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( ); });
关系:
-
one-to-one is a relationship
是一个国家只有一个首都,一个首都是一个国家的首都 -
one-to-many is a relationship
母亲有很多孩子的关系,孩子只有一个母亲 -
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
的_id
的projects
数组元素引用。
你可以实现如下:
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); });