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三个类别的数据,只需要做两处修改:
- 在
$group阶段按照A的统计逻辑,追加每个指定类别的条件累加统计 - 在
$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
相关产品推荐
相关产品推荐

