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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 11:55:26