如何通过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
相关产品推荐
相关产品推荐

