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

如何在Mongoose中筛选日期重复/非重复文档并统计时长

MongoDB按日期分组并计算时长总和的聚合方案

核心聚合管道

db.collection.aggregate([
  {
    $project: {
      // 将字符串格式的start、end转换为Date类型
      startDate: { $toDate: "$start" },
      endDate: { $toDate: "$end" },
      // 提取日期部分(YYYY-MM-DD)作为分组键
      date: { $dateToString: { format: "%Y-%m-%d", date: { $toDate: "$start" } } }
    }
  },
  {
    $project: {
      date: 1,
      // 计算单条文档的时长(毫秒数)
      duration: { $subtract: ["$endDate", "$startDate"] }
    }
  },
  {
    $group: {
      _id: "$date",
      // 求和每组的总时长
      totalDuration: { $sum: "$duration" },
      // 可选:保留组内所有文档的时长明细
      durationDetails: { $push: "$duration" }
    }
  },
  {
    // 可选:按日期倒序排列结果
    $sort: { _id: -1 }
  }
])

阶段说明

  1. 第一阶段$project:将文档中字符串类型的start和end转换为MongoDB可计算的Date类型,同时提取日期的YYYY-MM-DD部分作为后续分组的依据。
  2. 第二阶段$project:通过$subtract计算单条文档的时长(单位:毫秒),MongoDB中日期类型相减会直接得到毫秒数差值。
  3. 第三阶段$group:以提取的date作为分组键,用$sum累加每组内所有文档的时长,得到该日期的总时长;durationDetails字段为可选,用于保留组内每条文档的时长明细。
  4. 第四阶段$sort:可选阶段,按日期倒序排列结果,方便查看最新日期的数据。

结果示例

针对你提供的文档,执行后会得到如下结构的结果:

[
  {
    "_id": "2023-02-05",
    "totalDuration": 10762,
    "durationDetails": [6333, 4429]
  },
  {
    "_id": "2023-02-04",
    "totalDuration": 51614,
    "durationDetails": [34670, 56944]
  },
  {
    "_id": "2023-02-03",
    "totalDuration": 17923,
    "durationDetails": [17923]
  }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 18:50:26