如何基于expiryTime字段查询MongoDB文档,实现订阅到期预警
MongoDB 订阅到期预警文档检索方案
前提说明
假设你的集合中expiryTime字段存储的是MongoDB标准的ISODate类型(这是存储时间的最优格式,便于后续日期运算)。
场景1:批量检索即将到期的文档(剩余时长≤指定值)
适合批量给不同时间段到期的用户发送预警,比如先提醒1个月内到期的用户,再逐步缩小范围到1周、1天。
剩余1天及以内到期
db.yourCollection.find({ $expr: { $lte: [ { $subtract: ["$expiryTime", new Date()] }, // 计算到期时间与当前时间的毫秒差 1000 * 60 * 60 * 24 // 1天对应的毫秒数 ] } })
剩余1周及以内到期
db.yourCollection.find({ $expr: { $lte: [ { $subtract: ["$expiryTime", new Date()] }, 1000 * 60 * 60 * 24 * 7 // 1周对应的毫秒数 ] } })
剩余1个月及以内到期
这里按30天估算(若需精确匹配自然月,参考场景2):
db.yourCollection.find({ $expr: { $lte: [ { $subtract: ["$expiryTime", new Date()] }, 1000 * 60 * 60 * 24 * 30 // 30天对应的毫秒数 ] } })
场景2:精确匹配剩余时长的文档(正好剩余指定时长到期)
如果需要精准触发预警(比如用户订阅正好还有1个自然月到期时发送提醒),可以用以下方式:
正好剩余1天到期
db.yourCollection.find({ expiryTime: new Date(Date.now() + 1000 * 60 * 60 * 24) })
正好剩余1周到期
db.yourCollection.find({ expiryTime: new Date(Date.now() + 1000 * 60 * 60 * 24 * 7) })
正好剩余1个自然月到期
使用MongoDB 4.2+支持的$dateAdd操作符,精确计算自然月后的日期:
db.yourCollection.find({ $expr: { $eq: [ "$expiryTime", { $dateAdd: { startDate: new Date(), unit: "month", amount: 1 } } ] } })
性能优化
为expiryTime字段创建单字段索引,大幅提升查询效率:
db.yourCollection.createIndex({ expiryTime: 1 })
内容的提问来源于stack exchange,提问作者Farid Ghaderi
相关产品推荐
相关产品推荐

