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

MongoDB聚合:按日期分组后用$unwind,按商品类别统计日花费

解决每日采购按类别统计花费的问题

嘿,我明白你现在的需求——已经按日期分组了采购记录,但还想进一步拆解到每个商品类别,统计当日每个类别的总花费对吧?你当前的$group把整个items数组作为分组键的一部分,这没法单独提取类别做统计,咱们调整一下聚合管道就能搞定:

完整的聚合管道示例

db.purchases.aggregate([
  // 第一步:展开items数组,让每个商品条目成为独立文档
  { $unwind: "$items" },
  // 第二步:计算单个商品条目的总花费(单价*数量)
  {
    $addFields: {
      "items.item_total": { $multiply: ["$items.price", "$items.quantity"] }
    }
  },
  // 第三步:按采购日期和商品类别分组,统计每个类别的当日总花费
  {
    $group: {
      _id: {
        date: "$purchase_date",
        category: "$items.category"
      },
      total_category_cost: { $sum: "$items.item_total" }
    }
  },
  // 可选:整理输出格式,让结果更清晰
  {
    $project: {
      _id: 0,
      purchase_date: "$_id.date",
      category: "$_id.category",
      total_cost: "$total_category_cost"
    }
  }
])

针对你示例数据的输出结果

用你提供的采购数据:

{ purchase_date: ISODate("2018-03-11T00:00:00.000Z"), total_cost: 400, items: [ { title: 'Pringles', price: 200, quantity: 2, category: 'Snacks' } ] }

运行上面的聚合后会得到:

{
  "purchase_date" : ISODate("2018-03-11T00:00:00.000Z"),
  "category" : "Snacks",
  "total_cost" : 400
}

关键步骤解释

  • $unwind:把包含多个商品的items数组拆成单个文档,这样我们才能针对每个商品的category做后续分组。
  • $addFields:计算每个商品条目的实际花费(单价×数量),避免直接用原total_cost(因为它是整单总花费,没法拆分到类别)。
  • $group:这次把purchase_date和items.category作为联合分组键,用$sum累加每个类别的总花费。
  • 可选的$project:把结果字段重命名成更直观的格式,去掉冗余的_id结构。

如果你的数据里有同一日期多个类别、同一类别多个商品的情况,这个管道也能完美统计出每个类别的当日总花费哦!

内容的提问来源于stack exchange,提问作者Vladislav Achramovic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:19:24