2013-11-15 105 views
8

我的一個貓鼬模式的刪除多對多的引用是一個多對多的關係:在貓鼬

var UserSchema = new Schema({ 
    name  : String, 
    groups : [ {type : mongoose.Schema.ObjectId, ref : 'Group'} ] 
}); 

var GroupSchema = new Schema({ 
    name  : String, 
    users : [ {type : mongoose.Schema.ObjectId, ref : 'User'} ] 
}); 

如果我刪除了一批,反正是有從用戶的所有團體「刪除該組OBJECTID陣列?

GroupSchema.pre('remove', function(next){ 
    //Remove group._id from all the users 
}) 

回答

15

你在正確的軌道上使用'remove'中間件這一點。在中間件功能中,this是被刪除的組實例,您可以通過其model方法訪問其他模型。所以,你可以這樣做:

GroupSchema.pre('remove', function(next){ 
    this.model('User').update(
     {_id: {$in: this.users}}, 
     {$pull: {groups: this._id}}, 
     {multi: true}, 
     next 
    ); 
}); 

或者,如果你想支持情況下,在你的組實例的users字段可能是不完整的,你可以這樣做:

GroupSchema.pre('remove', function(next){ 
    this.model('User').update(
     {groups: this._id}, 
     {$pull: {groups: this._id}}, 
     {multi: true}, 
     next 
    ); 
}); 

但作爲WiredPrairie筆記,爲這個選項你想要一個索引groups以獲得良好的性能。

+3

如果'groups'沒有編入索引,您將強制進行全表掃描和用戶數組掃描。 – WiredPrairie

+0

@WiredPrairie如果雙向鏈接的引用是可靠的,那麼有一種解決方法。我補充說,作爲一個更好的選擇。 – JohnnyHK

+0

是的,這是一個改進,應該更好地工作。 – WiredPrairie