如何使子文档在mongoose中的特定日期到期?

时间:2017-06-29 18:01:08

标签: mongodb mongoose mongoose-schema ttl subdocument

我在mongoose的虚拟教室中有以下架构:

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,**
    }],
});

我希望每个课程在课程结束后从课堂到期。如何在mongoose的子文档中使用TTL?

1 个答案:

答案 0 :(得分:1)

无法使用ttl删除部分文档。我可以将其他两个选项视为一种解决方法:

  1. 参考
  2. lesson取出到自己的收藏中,并在其中放置classroom_id作为课堂参考。这样,您就可以单独使用ttl删除课程。

    1. Cronjob / Scheduler
    2. 使用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间隔,课程可以持续超过几分钟的到期日期。