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

MongoDB按日期分组时如何将每日数据拆分为两类统计输出

MongoDB按日期分组并分类统计的实现方案

核心实现逻辑

  • 首先将日期字段格式化为YYYY-MM-DD格式的字符串,作为分组依据,最终对应输出的label字段
  • 分组阶段通过$sum统计当日全量数据总数,对应输出的value字段
  • 分组阶段通过条件判断累加,单独统计指定类别的数据量,字段名直接使用对应类别名即可
  • 最后通过总数据量减去所有单独统计的指定类别数据量,得到其余类别的总数,对应Others字段

具体聚合语句示例

假设集合中存储时间的字段为createTime,分类存储字段为category,需要单独统计类别为A的数据量,其余类别归入Others,可直接使用如下聚合语句:

db.你的集合名.aggregate([
  {
    // 可选:提前过滤指定时间范围的数据,减少后续计算量,按需修改时间条件即可
    $match: {
      createTime: {
        $gte: ISODate("2020-08-01T00:00:00Z"),
        $lt: ISODate("2020-09-01T00:00:00Z")
      }
    }
  },
  {
    $group: {
      _id: {
        // 日期格式化为年-月-日格式作为分组键
        $dateToString: { format: "%Y-%m-%d", date: "$createTime" }
      },
      value: { $sum: 1 }, // 统计当日总数据条数
      // 单独统计category值为A的条数
      A: {
        $sum: {
          $cond: [{ $eq: ["$category", "A"] }, 1, 0]
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      label: "$_id", // 将分组日期重命名为label字段
      value: 1,
      A: 1,
      // 总条数减去A的条数,得到其余类别的总条数
      Others: { $subtract: ["$value", "$A"] }
    }
  },
  // 可选:按日期升序排序返回结果
  { $sort: { label: 1 } }
])

多指定类别扩展方法

如果需要单独统计的类别有多个,比如同时统计A、B、India三个类别的数据,只需要做两处修改:

  1. 在$group阶段按照A的统计逻辑,追加每个指定类别的条件累加统计
  2. 在$project阶段计算Others时,用总条数减去所有单独统计类别的条数之和

对应修改片段参考:

// $group阶段追加的统计逻辑
B: { $sum: { $cond: [{ $eq: ["$category", "B"] }, 1, 0] } },
India: { $sum: { $cond: [{ $eq: ["$category", "India"] }, 1, 0] } }

// $project阶段Others的计算逻辑修改为
Others: {
  $subtract: ["$value", { $add: ["$A", "$B", "$India"] }]
}

返回结果示例

语句执行后返回的结构完全匹配预期,示例如下:

{"label": "2020-08-21", "value": 5, "A": 2, "Others": 3}
{"label": "2020-08-21", "value": 7, "India": 3, "Others": 4}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 11:27:47