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

MongoDB按年月分组统计文档数量的聚合查询问题求助

MongoDB按年月分组统计文档数量的聚合查询问题求助

嗨,这个问题我之前处理过,咱们来一步步解决它~

首先说你报错的原因:你用$dateFromString的时候指定的格式是%Y-%m,但你的DateTime字段是完整的YYYY-MM-DD格式字符串,两者不匹配,所以MongoDB没法正确解析日期,自然就报错了。

给你两种可行的解决方案,你可以根据自己的需求选:

方案一:先转成日期对象再分组(通用型,适用于后续可能需要更多日期操作的场景)

先把字符串格式的日期转成MongoDB标准的Date对象,再提取年份和月份来分组,同时修正一下匹配条件避免漏掉12月31日的文档:

col.aggregate([
  { "$match": {
    "DateTime": { 
      "$gte": `${year}-01-01`, 
      "$lt": `${parseInt(year) + 1}-01-01` // 用下一年1月1日作为截止,避免漏掉当年12月31日的文档
    }
  }},
  { "$addFields": {
    // 用正确的格式把字符串转成日期对象
    "dateObj": { "$dateFromString": { "format": "%Y-%m-%d", "dateString": "$DateTime" } }
  }},
  { "$group": {
    "_id": {
      "year": { "$year": "$dateObj" },
      "month": { "$month": "$dateObj" }
    },
    "count": { "$sum": 1 }
  }},
  { "$sort": { "_id.year": 1, "_id.month": 1 } } // 可选,让结果按年月顺序排列
])

方案二:直接截取字符串分组(更高效,适用于日期格式固定的场景)

因为你的DateTime是固定的YYYY-MM-DD格式,直接截取前7个字符就能得到YYYY-MM,用这个来分组不需要做日期转换,性能更好:

col.aggregate([
  { "$match": {
    "DateTime": { 
      "$gte": `${year}-01-01`, 
      "$lt": `${parseInt(year) + 1}-01-01`
    }
  }},
  { "$group": {
    // 截取DateTime字段的前7位,得到YYYY-MM格式的字符串
    "_id": { "$substrCP": ["$DateTime", 0, 7] },
    "count": { "$sum": 1 }
  }},
  { "$sort": { "_id": 1 } } // 可选,按年月排序结果
])

另外补充一句:如果你的DateTime字段其实是MongoDB的Date类型(不是字符串),那直接在$group里用$year和$month提取就行,不需要转日期这一步~

备注:内容来源于stack exchange,提问作者Javi DR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 13:29:34