首页 > 解决方案 > 让到期日期触发 MongoDB 中的函数?

问题描述

我正在尝试建立一个用户/会员管理系统。用户将具有其会员资格的到期日期。我的数据库架构定义如下:

const membership = new mongoose.Schema({
    UserId:{ type: String, index: {unique: true} },
    name:String,
    joinDate:Date,
    expiryDate:Date,

})

我不知道该怎么做:当当前日期超过到期日期时,将运行一个函数 userExpired(),它会通知用户,要求他续订,并阻止他访问某些资源。但是如何触发这个功能呢?

我能想到的一种方法是:

在 linux 中使用“cron 作业”,它会以一定的时间间隔不断地运行代码。每次代码运行时,都会查询所有的 endDate 和 userid,然后一一比较(使用 .map() 或 .forEach() )。找到到期日期后,对该用户运行函数 userExpired()。

我不确定是否有另一种方法可以做到这一点。例如,如果 MongoDB 可以持续监控到期日期,并将其与当前日期进行比较,并调用该函数,我觉得它比 Linux 中的这种额外的“cron 工作”要好。任何建议表示赞赏!

标签: node.jsdatabasemongodbmongoose

解决方案


当且仅当使用 MongoDB Atlas 而不是自行部署的 MongoDB 数据库时,您可以查看stich triggers

假设您没有使用 MongoDB Atlas(并且由于某种原因您不能或不愿意使用它):

MongoDB 确实有TTL 索引(生存时间),但与您的用例不同,它不会触发某些功能,而是会删除/删除文档。此外,它还可以像 cron 作业一样工作。删除过期文档的后台任务每 60 秒运行一次。您可以将此索引用于您的用例的一种方法是使用像Debezium这样的 Change-Data-Capture 平台。

但是上述解决方案的部署和维护要复杂得多。我仍然建议您使用 Cron 作业,它更简单且技术上与 MongoDB 相同,它将在后台执行相同的操作。只是我要补充一点,您不需要遍历所有记录。只获取那些过期日期小于 now() 的记录。在将来插入记录集到期日期时。例如。如果您需要在 1 天后使一条记录过期,则过期日期应为 now() + 1 天。并且不要忘记在到期日添加索引。


推荐阅读