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
相关产品推荐
相关产品推荐

