MongoDB按MM/DD/YYYY日期字段分季节统计数量及Top2编码方法
MongoDB按季节统计文档数量及高频Code实现方案
问题背景
现有集合存储文档结构如下:
{ id: 1, issueDate: "07/05/2021", code: "31" }, { id: 2, issueDate: "12/11/2020", code: "14" }, { id: 3, issueDate: "02/11/2021", code: "98" }, { id: 4, issueDate: "01/02/2021", code: "14" }, { id: 5, issueDate: "06/23/2020", code: "14" }, { id: 6, issueDate: "07/01/2020", code: "31" }, { id: 7, issueDate: "07/05/2022", code: "14" }, { id: 8, issueDate: "07/02/2022", code: "20" }, { id: 9, issueDate: "07/02/2022", code: "14" }
其中issueDate为MM/DD/YYYY格式字符串,需按照季节规则(春季:3-5月、夏季:6-8月、秋季:9-11月、冬季:12-2月)完成两项统计:
- 统计每个季节对应的文档总数量,预期结果为夏季6条、冬季3条
- 统计每个季节下出现频次最高的前2个code值,预期结果为夏季对应code为14、31,冬季对应code为14、98
实现方案
通过MongoDB聚合管道可一次性完成两项统计,核心处理逻辑如下:
- 从
issueDate字符串中截取前两位月份值,转为整数类型 - 根据月份值映射对应季节
- 先按「季节+code」维度分组,统计每个code在对应季节的出现次数
- 再按「季节」维度分组,累加得到季节总文档数,同时收集该季节下所有code的出现次数
- 对每个季节下的code按出现次数降序排序,截取前2个高频code
- 整理输出字段格式
完整聚合代码
db.你的实际集合名.aggregate([ // 提取月份、映射所属季节 { $addFields: { season: { $switch: { branches: [ { case: { $in: [ { $toInt: { $substr: ["$issueDate", 0, 2] } }, [3,4,5] ] }, then: "春季" }, { case: { $in: [ { $toInt: { $substr: ["$issueDate", 0, 2] } }, [6,7,8] ] }, then: "夏季" }, { case: { $in: [ { $toInt: { $substr: ["$issueDate", 0, 2] } }, [9,10,11] ] }, then: "秋季" } ], default: "冬季" } } } }, // 按季节+code分组,统计单个code的出现次数 { $group: { _id: { season: "$season", code: "$code" }, codeCount: { $sum: 1 } } }, // 按季节分组,计算季节总文档数,收集所有code的计数 { $group: { _id: "$_id.season", totalCount: { $sum: "$codeCount" }, codeList: { $push: { code: "$_id.code", count: "$codeCount" } } } }, // 对code按频次降序排序,取前2个高频值 { $addFields: { top2Codes: { $slice: [ { $sortArray: { input: "$codeList", sortBy: { count: -1 } } }, 2 ] } } }, // 整理输出格式,移除多余字段 { $project: { _id: 0, season: "$_id", totalCount: 1, top2Codes: "$top2Codes.code" } } ])
如果使用的MongoDB版本低于5.0,不支持$sortArray操作符,可替换为$unwind拆分数组后排序、再分组重组数组的逻辑实现相同效果。
运行结果
执行上述聚合语句后,返回结果和预期完全匹配:
[ { "season": "夏季", "totalCount": 6, "top2Codes": ["14", "31"] }, { "season": "冬季", "totalCount": 3, "top2Codes": ["14", "98"] } ]
内容的提问来源于stack exchange,提问作者MaSha
相关产品推荐
相关产品推荐

