如何使子文档在猫鼬的特定日期过期?
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 间隔,课程可能会持续超过其到期日期几分钟。
【讨论】:
以上是关于如何使子文档在猫鼬的特定日期过期?的主要内容,如果未能解决你的问题,请参考以下文章