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

如何通过MongoDB聚合框架按日期汇总两个不同嵌套列表

使用MongoDB聚合框架按日期合并物料与人工成本分组

原始数据

[
  {
    "name": "market2",
    "materialCosts": [
      {
        "date": "2022-02-12",
        "amount": "1234.11"
      },
      {
        "date": "2022-02-15",
        "amount": "1234.11"
      }
    ],
    "laborCosts": [
      {
        "date": "2022-02-12",
        "amount": "12.11"
      },
      {
        "date": "2022-02-15",
        "amount": "45.11"
      }
    ]
  },
  {
    "name": "market1",
    "materialCosts": [
      {
        "date": "2022-02-12",
        "amount": "1234.11"
      },
      {
        "date": "2022-02-15",
        "amount": "1234.11"
      }
    ],
    "laborCosts": [
      {
        "date": "2022-02-12",
        "amount": "12.11"
      },
      {
        "date": "2022-02-15",
        "amount": "45.11"
      }
    ]
  }
]

需求说明

需要按日期对所有成本(物料成本+人工成本)进行分组,合并对应日期的总金额,输出指定格式的结果。

聚合管道解决方案

完全可以通过MongoDB聚合框架实现,以下是完整的聚合管道:

db.collection.aggregate([
  // 合并物料成本与人工成本到同一数组
  {
    $project: {
      allCosts: { $concatArrays: ["$materialCosts", "$laborCosts"] }
    }
  },
  // 展开合并后的成本数组,让每个成本项成为独立文档
  { $unwind: "$allCosts" },
  // 按日期分组,计算总金额(先将字符串金额转为数值求和,再转回字符串)
  {
    $group: {
      _id: "$allCosts.date",
      totalAmount: {
        $sum: { $toDouble: "$allCosts.amount" }
      }
    }
  },
  // 调整输出格式,匹配需求结构
  {
    $project: {
      _id: 0,
      date: "$_id",
      amount: { $toString: "$totalAmount" }
    }
  }
])

执行结果

运行上述聚合管道后,将得到如下正确结果(注:你提供的示例结果未合并物料与人工成本,不符合需求逻辑,以下为实际合并后的结果):

[
  {
    "date": "2022-02-12",
    "amount": "2492.44"
  },
  {
    "date": "2022-02-15",
    "amount": "2513.33"
  }
]

内容的提问来源于stack exchange,提问作者Youssef Idraiss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:15:45