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

Mongo视图中日期差值计算:如何统计记录日期距今天数

在MongoDB聚合管道中计算日期至今的天数差

嗨,我懂你已经对MongoDB聚合里的$add、$multiply、$ceil这些基础数学操作符很熟悉了,要搞定记录日期到当前日期的天数差这个需求,完全可以在聚合管道里直接实现,不用在客户端做JS计算,既高效又能利用Mongo的处理能力~

核心思路

和你之前的JS思路逻辑一致:计算两个日期的毫秒差值,再转换为天数,但我们用Mongo的聚合操作符来完成整个流程:

  1. 用$$NOW获取聚合执行时的当前时间(Mongo内置的管道变量,无需额外处理)
  2. 用$subtract计算当前时间与记录日期visitedAt的毫秒差
  3. 用$divide将毫秒差除以一天的毫秒数(1000 * 60 * 60 * 24,简写为86400000)得到天数
  4. 用$ceil/$floor/$round根据需求对天数取整

完整聚合示例

假设你的集合里有visitedAt字段存储访问日期,下面是直接计算天数差的管道:

db.yourCollection.aggregate([
  {
    $addFields: {
      // 新增一个字段存储天数差
      daysSinceVisit: {
        $ceil: { // 向上取整,比如访问后1小时也算1天;换成$floor是满24小时算1天,$round是四舍五入
          $divide: [
            { $subtract: [$$NOW, "$visitedAt"] }, // 当前时间 - 访问时间 = 毫秒差
            86400000 // 一天的毫秒数:1000ms*60s*60min*24h
          ]
        }
      }
    }
  }
])

处理边界情况

如果集合里存在visitedAt为null或无效日期的记录,可以用$cond做判断,避免计算出错:

db.yourCollection.aggregate([
  {
    $addFields: {
      daysSinceVisit: {
        $cond: {
          if: { $ne: ["$visitedAt", null] }, // 判断visitedAt是否不为空
          then: {
            $ceil: {
              $divide: [
                { $subtract: [$$NOW, "$visitedAt"] },
                86400000
              ]
            }
          },
          else: null // 为空时返回null,也可以设为0或其他默认值
        }
      }
    }
  }
])

为什么推荐在管道里计算?

相比你之前的客户端JS计算,这种方式有几个优势:

  • 减少客户端与数据库的数据传输,批量处理时性能提升明显
  • 可以结合其他聚合阶段(比如过滤、分组)一起处理,逻辑更连贯
  • 若visitedAt字段有索引,Mongo可以优化聚合流程,进一步提升效率

内容的提问来源于stack exchange,提问作者Muirik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:44:39