2015-01-02 114 views
0

在我有這個簡單的模式至今:貓鼬 - 參考嵌入式ID父文檔

var room = new Schema(
    { 
    name: { type: String, default: null, trim: true } 
    }); 

var event = new Schema({ 
    name:   { type: String, default: null, trim: true }, 
    startDate:  Date, 
    endDate:   Date, 
    logo:   { type: Boolean, default: false }, 
    public:   { type: Boolean, default: false }, 
    rooms:   [room] 
    sessions:  [ 
    { 
     title:  { type: String, default: null, trim: true }, 
     description: { type: String, default: null, trim: true }, 
     date:  Date, 
     start:  Number, 
     end:   Number, 
     room:  { type: Schema.Types.ObjectId, ref: 'room' } 
    } 
    ] 
}); 

我知道如何引用另一個集合,但我怎麼父文檔中引用的嵌入式ID?

我知道這個模式是不正確的,因爲即使我刪除了一個房間,房間引用也不會從它被引用的會話中刪除。

在此先感謝!

回答

2

您可以在房間模式中創建對事件的引用。然後,使用schema.pre中間件刪除主要父級房間中的sessions.room值(確保從主要房間刪除eventid房間模式也是如此)。另請參閱Removing many to many reference in Mongoose

var room = new Schema({ 
    name: { 
     type: String, 
     default: null, 
     trim: true 
    }, 
    eventid: { 
     type: Schema.Types.ObjectId, //Set reference to event here. 
     ref: 'event' 
    } 
}); 

room.pre('remove', function(next) {//event is the schema name. 
    this.model('event').update({; //this will have all the models,select the event 
      sessions.room: this._id//will have the room id thats being deleted 
     }, { 
      $pull: { 
       sessions.room: this._id//removes that array from the event.sessions.room 
      } 
     }, { 
      multi: true 
     }, 
     next();//continues and completes the room.remove. 
    ); 
}); 
+0

優秀。非常感謝您的回答。 – Flukey