2013-11-15 22 views
8

Một trong schemas mongoose của tôi là một nhiều mối quan hệ:Loại bỏ nhiều nhiều tài liệu tham khảo trong 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'} ] 
}); 

Nếu tôi loại bỏ một nhóm, là có anyway để loại bỏ nhóm ObjectId từ tất cả các 'nhóm' của người dùng mảng?

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

Trả lời

15

Bạn đang đi đúng hướng để sử dụng 'remove' phần mềm trung gian cho việc này. Trong chức năng phần mềm trung gian, this là phiên bản nhóm được xóa và bạn có thể truy cập các mô hình khác thông qua phương thức model của nó. Vì vậy, bạn có thể làm điều gì đó như:

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

Hoặc nếu bạn muốn hỗ trợ trường hợp users lĩnh vực trong trường hợp nhóm của bạn có thể không được hoàn tất, bạn có thể làm:

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

Nhưng như ghi chú WiredPrairie, cho tùy chọn này bạn muốn có chỉ mục trên groups để có hiệu suất tốt.

+3

Và nếu 'nhóm' không được lập chỉ mục, bạn sẽ bắt buộc quét toàn bộ bảng và quét mảng người dùng. – WiredPrairie

+0

@WiredPrairie Có một cách xung quanh rằng nếu các tài liệu tham khảo hai lần liên kết là đáng tin cậy. Tôi đã thêm rằng như là một lựa chọn tốt hơn. – JohnnyHK

+0

Vâng, đó là một cải tiến và sẽ hoạt động tốt hơn. – WiredPrairie

Các vấn đề liên quan