MongoDB聚合:如何无需手动指定食品项自动统计或更新总和?
自动统计所有食品的总和方案
可以通过MongoDB的聚合管道操作实现自动统计所有食品的总和,无需手动枚举每个食品名称,具体实现如下:
聚合管道代码示例
const request = await customers.aggregate([ // 将food对象转为键值对数组,每个元素格式为 { k: 食品名, v: 数量 } { $addFields: { foodItems: { $objectToArray: "$shoping_list.food" } } }, // 展开foodItems数组,让每个食品条目成为独立文档 { $unwind: "$foodItems" }, // 按食品名分组,统计总数量 { $group: { _id: "$foodItems.k", total: { $sum: "$foodItems.v" } } }, // 可选:重命名字段,让结果更直观 { $project: { _id: 0, foodName: "$_id", totalQuantity: "$total" } } ]);
步骤说明
- $objectToArray:把
shoping_list.food对象转换成数组,解决无法直接遍历对象键的问题,转换后每个元素包含k(食品名称)和v(对应数量)两个字段。 - $unwind:将数组展开,使每个食品条目生成单独的文档,便于后续分组统计。
- $group:以食品名称(
foodItems.k)为分组依据,用$sum累加每个食品的总数量。 - $project:可选步骤,用于调整输出字段名称,让结果结构更清晰。
输出结果示例
执行代码后会得到每种食品的总数量:
[ { "foodName": "Pizza", "totalQuantity": 4 }, { "foodName": "Ramen", "totalQuantity": 2 }, { "foodName": "Sushi", "totalQuantity": 5 }, { "foodName": "Burger", "totalQuantity": 1 } ]
如果需要统计所有食品的总数量之和,可将分组的_id设为null,直接累加所有数量:
const totalAllFood = await customers.aggregate([ { $addFields: { foodItems: { $objectToArray: "$shoping_list.food" } } }, { $unwind: "$foodItems" }, { $group: { _id: null, totalAll: { $sum: "$foodItems.v" } } } ]); // 输出:[{ "_id": null, "totalAll": 12 }]
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

