如何基于数组创建带分组的Facet?MongoDB聚合查询求助
MongoDB按categoryName分组统计item数量实现方案
原始MongoDB文档:
{"_id": 12345,"itemDetails": {"item": [{"id": "51","name": "Chips","categoryId": "101","categoryName": "Solid"},{"id": "52","name": "Apple cider","categoryId": "102","categoryName": "Liquid"},{"id": "52","name": "Mango Juice","categoryId": "103","categoryName": "Liquid"}]}}
期望分组统计结果:
{"items": [{"id": "51","count": 1,"key": "Solid"},{"id": "52","count": 2,"key": "Liquid"}]}
错误查询问题分析
你之前的查询存在两个核心问题:
- 直接对数组字段
$itemDetails.item.id执行分组,MongoDB无法直接解析数组内的单个元素进行分组计算; - 分组逻辑未关联
categoryName作为维度,导致分组规则不符合需求,最终返回异常结果。
正确聚合查询实现
[ // 展开item数组,将每个数组元素转为独立文档 { "$unwind": "$itemDetails.item" }, // 按item的id和categoryName联合分组,统计每组数量 { "$group": { "_id": { "id": "$itemDetails.item.id", "categoryName": "$itemDetails.item.categoryName" }, "count": { "$sum": 1 } } }, // 调整输出字段结构,匹配期望格式 { "$project": { "_id": 0, "id": "$_id.id", "count": 1, "key": "$_id.categoryName" } }, // 将所有统计结果整合到items数组中 { "$group": { "_id": null, "items": { "$push": "$$ROOT" } } } ]
步骤说明
- $unwind:拆分
itemDetails.item数组,把每个数组元素转为独立文档,这是处理数组类型字段分组的必要前提; - 第一次$group:以
item.id和categoryName作为联合分组键,用$sum:1统计每组的条目数量; - $project:重命名字段,将分组键中的内容映射为期望的
id和key字段,同时移除默认生成的_id; - 第二次$group:把分散的统计结果合并到
items数组中,完全匹配期望的输出结构。
内容的提问来源于stack exchange,提问作者user1893874
相关产品推荐
相关产品推荐

