我的一个猫鼬模式是多对多的关系:
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
})
答案 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