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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 07:27:38