如何使子文档在猫鼬的特定日期过期?

Posted

技术标签:

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

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

var clas-s-roomSchema = 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?

【问题讨论】:

【参考方案1】:

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

    参考

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

    Cronjob/调度器

使用像 cron 这样的调度程序每隔几分钟/几小时运行一次作业,以在课堂上查找过期日期已过的课程,并将其从 lesson 数组中删除。

var CronJob = require('cron').CronJob;

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

job.start();

要在子文档数组中搜索expiresAt,您可以使用$elemMatch 运算符,如this 示例所示。

方法 2 的唯一缺点是,根据您选择的 cronjob 间隔,课程可能会持续超过其到期日期几分钟。

【讨论】:

以上是关于如何使子文档在猫鼬的特定日期过期?的主要内容,如果未能解决你的问题,请参考以下文章

如何在猫鼬的集合中找到文档项的平均值?

如何在猫鼬的数组中使用不同类型的模式?

如何在猫鼬的 document.save() 回调中隐藏字段?

如何在猫鼬的路由器中等待函数完成其所有内部表达式?

如何在猫鼬中异步填充嵌套对象?

在猫鼬的子数组中获取具有匹配对象的对象