2013-11-15 7 views
8
私のマングーススキーマの

一つで、多くの参照に多くを削除すると、多くの関係に多くされています。私はグループを削除する場合は、すべてのユーザーの「グループ」から、そのグループOBJECTIDを除去するためにとにかくがあるマングース

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

アレイ?

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

答えて

15

これは正しい道で'remove'ミドルウェアを使用しています。ミドルウェア機能では、thisが削除されているグループインスタンスで、そのmodelメソッドを使用して他のモデルにアクセスできます。あなたは、グループインスタンス内usersフィールドは、完全ではないかもしれないケースをサポートするかどうか、あなたが行うことができ

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

:だからあなたのような何かを行うことができます

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