You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:10:51