MongoDB分组统计问题:按科目类型分组并统计数量
需求
- 针对每种科目类型,列出科目类型名称及该类型下的科目总数。
数据库文档结构
集合Subject中的文档包含嵌套的subject数组,每个数组元素记录科目名称与类型,示例结构如下:
// 集合示例文档 { "subject": [ {"name": "数学", "type": "理科"}, {"name": "物理", "type": "理科"}, {"name": "化学", "type": "理科"}, {"name": "语文", "type": "文科"}, {"name": "英语", "type": "文科"}, {"name": "历史", "type": "文科"}, {"name": "地理", "type": "文科"} ] }
我的尝试
我针对需求编写了以下聚合语句,但结果均不符合预期:
- 语句:
db.Subject.aggregate([{"$group":{"_id":"subject.$type","count":{"$sum":1}}}}])
结果:
{ "_id" : "subject.$type", "count" : 7 }
- 语句:
db.Subject.aggregate([{"$unwind":"$subject"},{"$group":{"_id":"$type"}}])
结果:
{ "_id" : null }
- 语句:
db.Subject.aggregate([{"$unwind":"$subject"},{"$group":{"_id":{"subject.type":"$subject.type"},"count":{"$sum":1}}}}])
(未得到符合需求的结果)
正确实现方案
要实现按科目类型统计总数,需先展开嵌套的subject数组,再按科目类型字段分组统计:
db.Subject.aggregate([ // 将subject数组的每个元素拆分为独立文档 { "$unwind": "$subject" }, // 按subject.type分组,统计每组的科目数量 { "$group": { "_id": "$subject.type", "count": { "$sum": 1 } } } ])
执行后会得到如下结果:
{ "_id" : "理科", "count" : 3 } { "_id" : "文科", "count" : 4 }
错误原因说明
- 第一个语句:将
"subject.$type"作为字符串字面量而非字段路径,导致MongoDB将所有文档归为一组,统计的是集合中文档总数。 - 第二个语句:展开数组后,分组键使用
$type而非正确的$subject.type,因找不到对应字段,_id返回null。 - 第三个语句:分组键是包含
subject.type的对象,虽能统计数量,但类型名称嵌套在对象中,不符合“直接列出科目类型名称”的需求。
内容的提问来源于stack exchange,提问作者Bryead
相关产品推荐
相关产品推荐

