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

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
        }
    }
];

关键修改点说明

  1. 分组阶段:将_id从单纯的月份改为包含year和month的组合键,确保不同年份的同月份数据不会被合并,同时为排序提供年份维度。
  2. 排序阶段:先按year升序,再按month升序,这样去年12月(如2022-12)会自然排在今年1月(2023-01)之前。
  3. 可选优化:用$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 14:41:45