2017-06-29 96 views
1

我對貓鼬虛擬教室下面的模式:如何使子文件在貓鼬的特定日期到期?

var classroomSchema = mongoose.Schema({ 
    studentIds: [mongoose.Schema.Types.ObjectId], 
    teacherIds: [mongoose.Schema.Types.ObjectId], 
    teacherNames: [String], 
    createdAt: { 
     type: Date, 
     default: Date.now(), 
    }, 
    lessons: [{ 
     name: String, 
     startDate: { 
      type: Date, 
      min: Date.now(), 
     }, 
     endDate: { 
      type: Date, 
      min: Date.now(), 
     }, 
     **expiresAt: endDate,** 
    }], 
}); 

我想每節課從教室theer結束日期過後到期。我如何在貓鼬的子文檔中使用TTL?

回答

1

文檔的一部分不能用ttl刪除。我能想到的其他兩個選項作爲一種解決方法:

  1. 參考

取出lesson自身的收集,並放置在classroom_id作爲參考教室。這樣你就可以用ttl單獨刪除課程。

  • 的cronjob /調度
  • 使用像cron調度運行工作,每隔幾分鐘/小時在教室教訓,找到到期日通過並刪除它們來自lesson數組。

    var CronJob = require('cron').CronJob; 
    
    var job = new CronJob({ 
        cronTime: '00 */20 * * * *', //run every 20 minutes 
        onTick: function() { 
         //Find classrooms with lessons which have expiry date smaller than Date.now 
         //Remove those lessons from array and update the classrooms 
        }, 
        start: false, 
        timeZone: 'America/Los_Angeles' 
    }); 
    
    job.start(); 
    

    對於子文檔的陣列內搜索expiresAt可以使用$elemMatch操作者,如圖this例子。

    方法2唯一的缺點是,根據您選擇的cronjob間隔,課程可以持續通過其失效日期幾分鐘。