MongoDB按月份分组后如何正确排序?解决跨年度排序异常
解决MongoDB按月份分组排序时跨年顺序异常的问题
问题原因
你的聚合查询仅按月份数字分组,没有区分年份。当数据包含去年12月和今年1月时,排序会单纯比较月份数字:12 > 1,导致去年12月被排在今年1月之后,不符合实际时间顺序。
修复方案
需要在分组阶段同时按年份+月份分组,排序时先按年份升序,再按月份升序,确保跨年数据的时间顺序正确。
修改后的完整聚合查询
var projectQry = [ { $match: { "Partner_ID": userId } }, { $unwind: "$EarningsData" }, { $group: { _id: { year: { $year: "$EarningsData.From_Date" }, month: { $month: "$EarningsData.From_Date" } }, Gross: { $sum: "$EarningsData.Gross_Amount" }, Tax: { $sum: "$EarningsData.Tax_Amount" }, Net: { $sum: "$EarningsData.Net_Amount" } } }, { $project: { _id: 0, // 可选:生成"YYYY-MM"格式的月份标签,方便前端展示 Month: { $dateToString: { format: "%Y-%m", date: { $dateFromParts: { year: "$_id.year", month: "$_id.month", day: 1 } } } }, Gross: 1, Tax: 1, Net: 1 } }, { $sort: { // 先按年份排序,再按月份排序 "_id.year": 1, "_id.month": 1 } } ];
关键修改点说明
- 分组阶段:将
_id从单纯的月份改为包含year和month的组合键,确保不同年份的同月份数据不会被合并,同时为排序提供年份维度。 - 排序阶段:先按
year升序,再按month升序,这样去年12月(如2022-12)会自然排在今年1月(2023-01)之前。 - 可选优化:用
$dateFromParts和$dateToString生成YYYY-MM格式的月份标签,既保留时间信息,又方便前端直接展示。
简化版(无需单独年份字段)
如果不需要单独的年份展示,也可以直接基于分组的_id排序,省略投影阶段的年份拆分:
var projectQry = [ { $match: { "Partner_ID": userId } }, { $unwind: "$EarningsData" }, { $group: { _id: { year: { $year: "$EarningsData.From_Date" }, month: { $month: "$EarningsData.From_Date" } }, Gross: { $sum: "$EarningsData.Gross_Amount" }, Tax: { $sum: "$EarningsData.Tax_Amount" }, Net: { $sum: "$EarningsData.Net_Amount" } } }, { $project: { _id: 0, Month: "$_id.month", Year: "$_id.year", Gross: 1, Tax: 1, Net: 1 } }, { $sort: { Year: 1, Month: 1 } } ];
内容的提问来源于stack exchange,提问作者user20933891
相关产品推荐
相关产品推荐

