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
相关产品推荐
相关产品推荐

