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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:53:19