2013-11-15 10 views
8

Uno dei miei schemi mangusta è una relazione molti a molti:Rimozione molti a molti di riferimento in 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'} ] 
}); 

Se rimuovo un gruppo, c'è comunque di rimuovere quel gruppo objectId da tutti i 'gruppi' degli utenti array?

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

risposta

15

Sei sulla buona strada per utilizzare il middleware 'remove' per questo. Nella funzione middleware, this è l'istanza di gruppo rimossa ed è possibile accedere agli altri modelli tramite il suo metodo model. Così si può fare qualcosa di simile:

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

Oppure, se si vuole sostenere i casi in cui il campo users nell'istanza gruppo non può essere completo che si possa fare:

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

Ma, come note WiredPrairie, per questa opzione vorresti un indice su groups per buone prestazioni.

+3

E se 'groups' non è indicizzato, si forza uno scansione completa della tabella e la scansione gamma di utenti. – WiredPrairie

+0

@WiredPrairie C'è un modo per aggirare questo se i riferimenti doppiamente collegati sono affidabili. L'ho aggiunto come opzione migliore. – JohnnyHK

+0

Sì, questo è un miglioramento e dovrebbe funzionare meglio. – WiredPrairie