MongoDB如何按分类统计去重后的SKU总数量?
MongoDB按分类统计去重SKU数量解决方案
你提交的查询不符合预期的原因有两点:
- 首次
$group阶段将sku作为分组键的一部分,会为每个唯一的(category, sku)组合生成独立分组,你提供的测试数据中4条记录的sku均不重复,因此该阶段会输出4个分组。 - 后续直接调用
$count统计的是上一阶段所有分组的总条数,没有按category维度做聚合,自然得到总数量4的结果。
以下是两种符合你需求的实现方案:
方案1:使用$addToSet + $size实现(性能更优)
db.ecomm_sku_count.aggregate([ // 按category分组,将同分类下所有sku存入自动去重的数组 { $group: { _id: "$category", sku_set: { $addToSet: "$sku" } } }, // 格式化输出为你要求的结构 { $project: { _id: { category: "$_id", sku_count: { $size: "$sku_set" } } } } ])
方案2:二次分组实现(逻辑更直观)
db.ecomm_sku_count.aggregate([ // 首次分组:按category+sku去重,确保同分类下相同sku只保留一条记录 { $group: { _id: { category: "$category", sku: "$sku" } } }, // 二次分组:按category统计去重后的sku总数,同时格式化输出结构 { $group: { _id: { category: "$_id.category", sku_count: { $sum: 1 } } } } ])
两种方案的输出完全匹配你要求的格式:
[ { "_id": { "category": "electronics", "sku_count": 3 } }, { "_id": { "category": "apparels", "sku_count": 1 } } ]
内容的提问来源于stack exchange,提问作者CK5
相关产品推荐
相关产品推荐

