删除Mongoose中的多对多引用

时间:2013-11-15 19:32:30

标签: node.js mongodb mongoose many-to-many nosql

我的一个猫鼬模式是多对多的关系:

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
})

2 个答案:

答案 0 :(得分:17)

您正准备使用'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上的索引以获得良好的性能。

答案 1 :(得分:0)

我使用我的修补版本的mongoose-relationship“插件”来解决这个问题:看一下 https://github.com/begrossi/mongoose-relationship/tree/remove-from-parent-if-removed-from-child-set

Bruno Grossi