我在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?
答案 0 :(得分:1)
无法使用ttl删除部分文档。我可以将其他两个选项视为一种解决方法:
将lesson
取出到自己的收藏中,并在其中放置classroom_id
作为课堂参考。这样,您就可以单独使用ttl删除课程。
使用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间隔,课程可以持续超过几分钟的到期日期。