2015-09-19 74 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); 
});