MongoDB多字段(Material/交易日期/过期日期)聚合错误排查
MongoDB库存数据聚合问题修正方案
问题分析
你遇到的异常(_id为null、字段为空、datas数组全空),大概率是以下原因导致:
- 聚合时使用的字段名与集合中实际字段名不匹配(MongoDB字段名区分大小写)
- 聚合阶段顺序错误,前置阶段过滤掉了必要字段
- 嵌套分组的逻辑错误,导致数据无法正确聚合
正确聚合实现
假设你的库存集合名为inventory,以下是符合需求的聚合管道代码:
db.inventory.aggregate([ // 1. 先按Material、expiredDate、Transaction_Date组合分组,统计单组Jumlah总和 { $group: { _id: { Material: "$Material", expiredDate: "$expiredDate", Transaction_Date: "$Transaction_Date" }, totalJumlah: { $sum: "$Jumlah" } } }, // 2. 再按Material+expiredDate分组,整理同组内的交易日期统计数据 { $group: { _id: { Material: "$_id.Material", expiredDate: "$_id.expiredDate" }, datas: { $push: { Transaction_Date: "$_id.Transaction_Date", totalJumlah: "$totalJumlah" } } } }, // 可选:格式化输出,将_id中的字段提取到顶层(按需使用) { $project: { _id: 0, Material: "$_id.Material", expiredDate: "$_id.expiredDate", datas: 1 } } ])
错误排查要点
- 字段名校验:确保
Material、Transaction_Date、expiredDate、Jumlah的拼写、大小写与集合中实际字段完全一致,比如不要把expiredDate写成expired_date。 - 前置阶段检查:如果聚合前有
$match或$project阶段,确认没有排除上述必要字段,否则后续分组会因字段缺失导致结果为空。 - 分组逻辑校验:必须先按三个字段组合分组统计,再按Material+expiredDate合并交易日期数据,颠倒顺序会导致数据结构混乱。
预期输出示例
[ { "Material": "MAT001", "expiredDate": ISODate("2024-12-31"), "datas": [ { "Transaction_Date": ISODate("2024-01-01"), "totalJumlah": 100 }, { "Transaction_Date": ISODate("2024-01-02"), "totalJumlah": 75 } ] }, { "Material": "MAT001", "expiredDate": ISODate("2025-12-31"), "datas": [ { "Transaction_Date": ISODate("2024-01-01"), "totalJumlah": 50 } ] } ]
内容的提问来源于stack exchange,提问作者Josea Samoa
相关产品推荐
相关产品推荐

