【问题标题】:How can I make a subdocument expire at a particular date in mongoose?如何使子文档在猫鼬的特定日期过期?
【发布时间】:2017-12-03 13:32:35
【问题描述】:

我有以下 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,**
    }],
});

我希望每节课都在 endDate 过去后从课堂过期。如何在 mongoose 的子文档中使用 TTL?

【问题讨论】:

    标签: mongodb mongoose mongoose-schema ttl subdocument


    【解决方案1】:

    无法使用 ttl 删除文档的一部分。我可以考虑其他两个选项作为解决方法:

    1. 参考

    lesson 取出到它自己的集合中,并将classroom_id 放入其中作为课堂参考。这样您就可以单独使用 ttl 删除课程。

    1. 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 间隔,课程可能会持续超过其到期日期几分钟。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 2016-07-30
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      相关资源
      最近更新 更多