2013-11-15 10 views
8

jeden z moich schematów Mongoose jest wiele do wielu relacji:Usuwanie wiele do wielu odniesienia w Mongoose

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'} ] 
}); 

Jeśli usunąć grupę, czy jest tak, aby usunąć tę grupę objectID ze wszystkich „grup” użytkownika szyk?

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

Odpowiedz

15

Jesteś na dobrej drodze do używania oprogramowania pośredniego 'remove'. W funkcji oprogramowania pośredniego this jest usuwana instancja grupy i można uzyskać dostęp do innych modeli za pomocą metody model. Więc można zrobić coś takiego:

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

Lub jeśli chcesz obsługiwać przypadki, w których pole w przypadku grupy users może nie być kompletna można zrobić:

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

Ale jak zauważa WiredPrairie, dla ta opcja, którą chcesz mieć indeks na groups dla dobrej wydajności.

+3

A jeśli 'groups' nie jest indeksowana, można wymusić pełne skanowanie tabeli i skanowanie tablicę użytkowników. – WiredPrairie

+0

@WiredPrairie Jest to na odwrót, jeśli podwójne odniesienia są wiarygodne. Dodałem, że jako lepszą opcję. – JohnnyHK

+0

Tak, to jest poprawa i powinno działać lepiej. – WiredPrairie