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

MongoDB中按计算日期分组:时间区间频次统计方案咨询

实现MongoDB时间区间的分钟级覆盖频次统计

没问题!你想要的是统计每个整点分钟被多少个原始时间区间覆盖,通过MongoDB的聚合管道完全可以实现这个需求。下面是具体的实现方案:

完整聚合查询代码

假设你的集合名为yourCollection,执行以下聚合查询就能得到你需要的结果:

db.yourCollection.aggregate([
  // 1. 截断时间到分钟级别,计算覆盖的分钟范围
  {
    $addFields: {
      start_min: { $dateTrunc: { date: "$start_time", unit: "minute" } },
      end_min: { $dateTrunc: { date: "$end_time", unit: "minute" } },
      minute_diff: {
        $add: [
          { $divide: [{ $subtract: ["$end_min", "$start_min"] }, 60000] },
          1
        ]
      }
    }
  },
  // 2. 生成当前区间覆盖的所有分钟时间数组
  {
    $addFields: {
      covered_minutes: {
        $map: {
          input: { $range: [0, "$minute_diff"] },
          as: "offset",
          in: { $add: ["$start_min", { $multiply: ["$$offset", 60000] }] }
        }
      }
    }
  },
  // 3. 展开数组,每个分钟成为独立文档
  { $unwind: "$covered_minutes" },
  // 4. 按分钟分组统计频次
  {
    $group: {
      _id: "$covered_minutes",
      count: { $sum: 1 }
    }
  },
  // 5. 转换为目标键值对格式
  {
    $replaceRoot: {
      newRoot: {
        $arrayToObject: [[{ k: "$_id", v: "$count" }]]
      }
    }
  }
])

各阶段详细解释

  • 第一步:截断时间并计算范围
    用$dateTrunc把start_time和end_time截断到对应的整点分钟(比如2017-08-22T19:43:41.442Z会变成2017-08-22T19:43:00.000Z)。然后计算两个分钟时间的差值,转换成分钟数后加1,确保包含开始和结束的两个分钟区间。

  • 第二步:生成覆盖的分钟数组
    通过$range生成从0到minute_diff的数字数组,再用$map把每个数字偏移量转换成对应的分钟时间(给start_min加上偏移分钟数的毫秒值),这样就得到了当前时间区间覆盖的所有分钟集合。

  • 第三步:展开数组
    用$unwind把数组拆分成独立文档,每个文档对应一个被覆盖的分钟,方便后续分组计数。

  • 第四步:分组统计
    按covered_minutes(分钟时间)分组,用$sum:1统计每个分钟被多少个原始时间区间覆盖。

  • 第五步:转换格式
    用$arrayToObject把分组结果的_id(分钟时间)和count(频次)转换成键值对,再通过$replaceRoot替换为根文档,最终得到你想要的输出格式。

兼容旧版本MongoDB(低于4.2)

如果你的MongoDB版本不支持$dateTrunc,可以用$dateFromParts手动构造分钟级时间:

start_min: {
  $dateFromParts: {
    year: { $year: "$start_time" },
    month: { $month: "$start_time" },
    day: { $dayOfMonth: "$start_time" },
    hour: { $hour: "$start_time" },
    minute: { $minute: "$start_time" }
  }
},
end_min: {
  $dateFromParts: {
    year: { $year: "$end_time" },
    month: { $month: "$end_time" },
    day: { $dayOfMonth: "$end_time" },
    hour: { $hour: "$end_time" },
    minute: { $minute: "$end_time" }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:46:51