2015-09-19 91 views
8

我有一个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 
}); 

从夫妇在计算器的答案,我来了解删除中间件,但我不知道如何实现它的one-one and one-many关系。任何人都可以给我看一个例子。

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

    ); 
}); 

回答

12

关系:

  1. 一个one-to-one is a relationship这样,一个国家只有一个 省会城市和省会城市是唯一的资本一种状态
  2. A one-to-many is a relationship这样一位母亲有很多 孩子,并且孩子只有一个母亲
  3. A many-to-many is a relationship这样一本书可以由 几位作者或共同作者写,而作者可以写几本 书。

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

通常你将有一个project映射到映射到一个project一个assignment,同样一个assignment。你可以在这里做的是删除一个项目,然后在赋值模型中找到相关的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);          
        } 
        }); 
      }); 
     }); 
} 

删除中间件

你可以通过middleware达到同样的事情,由约翰尼指出的那样,仅仅是修正上..

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

通常可以有很多projects属于到assignment和许多assignments属于相同的project。您的Project模式中将有一个assignment列,其中一个项目将与多个分配相关。

注意:删除中间件不适用于模型,它只能在您的文档上工作。如果你打算用remove中间件确保你的删除功能,你首先通过id找到project,然后在返回document上应用remove方法,所以对于上面的工作...你的删除函数看起来像这样。

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

removemiddleware,你定义的操作时,其型号为该模式的文档通过Model#remove被删除取。所以:

  • 当一组被删除,你要删除的group参考该集团的_id所有分配文档。
  • 当一个项目被移除时,你想从所有赋值文档中删除对该项目的_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); 
});