MongoDB聚合统计商品分类数量时分类名称为null的解决方法
解决MongoDB聚合统计分类商品数量时分类名称为空的问题
我看你现在的问题是想统计每个分类下的商品数量,但聚合结果里的分类名称一直是null,这是因为你的聚合流程里根本没关联Category集合,只是在Product文档里打转,自然拿不到分类的名称啦。咱们一步步来理清楚:
你的文档结构
Product文档
{ "_id" : ObjectId("5d81171c2c69f45ef459e0af"), "type" : "T-Shirt", "name" : "Panda", "description" : "Panda's are cool.", "image" : ObjectId("5d81171c2c69f45ef459e0ad"), "created_at" : ISODate("2019-09-17T18:25:48.026+01:00"), "is_featured" : false, "sizes" : [ "XS", "S", "M", "L", "XL" ], "tags" : [ ], "pricing" : { "price" : 26, "sale_price" : 8 }, "categories" : [ ObjectId("5d81171b2c69f45ef459e086"), ObjectId("5d81171b2c69f45ef459e087") ], "sku" : "5d81171c2c69f45ef459e0af" }
Category文档
{ "_id" : ObjectId("5d81171b2c69f45ef459e087"), "name" : "Art", "description" : "These items are our artsy options.", "created_at" : ISODate("2019-09-17T18:25:47.196+01:00") }
你当前聚合语句的问题
你现在的聚合流程里,只是对Product的categories数组做了拆分、分组,但全程没有和Category集合关联。而且中间的$group操作里,_id: { "name" : "$name" }里的$name是Product的name,不是分类的name,这完全偏离了你的需求,最后自然拿不到分类名称。
正确的聚合方案
我们需要用$lookup来关联Category集合,把分类的名称取出来,再做统计。完整的聚合语句如下:
db.product.aggregate([ // 第一步:拆分商品的分类数组,让每个分类对应一条商品记录 { $unwind: "$categories" }, // 第二步:关联Category集合,根据分类ID获取分类名称 { $lookup: { from: "category", // 你的Category集合名称,注意大小写匹配 localField: "categories", foreignField: "_id", as: "category_info" } }, // 拆分关联后的category_info数组($lookup默认返回数组,哪怕只匹配到一条) { $unwind: "$category_info" }, // 第三步:按分类的ID和名称分组,统计商品数量 { $group: { _id: "$categories", name: { $first: "$category_info.name" }, items_in_cat: { $sum: 1 } } }, // 按商品数量降序排序 { $sort: { items_in_cat: -1 } } ])
每一步的简单解释:
$unwind: "$categories":把每个商品的分类数组拆分成多条记录,比如一个商品属于2个分类,就变成2条独立记录,每条对应一个分类ID。$lookup:从Category集合里匹配当前分类ID对应的文档,把分类的完整信息(包括name)放到category_info字段里。$unwind: "$category_info":因为$lookup返回的是数组格式,所以拆成单个对象方便后续分组处理。$group:按分类ID分组,用$first取分类名称(同一分类的名称完全一致,取第一个就行),用$sum:1统计该分类下的商品总数。$sort:按商品数量从多到少排序,和你原来的需求保持一致。
预期结果
运行上面的语句后,就能得到你想要的结果:
{ "_id" : ObjectId("5d81171b2c69f45ef459e087"), "name" : "Art", "items_in_cat" : 4 }
内容的提问来源于stack exchange,提问作者Jamie Lindsey
相关产品推荐
相关产品推荐

