You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB分组统计问题:按科目类型分组并统计数量

需求
  • 针对每种科目类型,列出科目类型名称及该类型下的科目总数。
数据库文档结构

集合Subject中的文档包含嵌套的subject数组,每个数组元素记录科目名称与类型,示例结构如下:

// 集合示例文档
{
  "subject": [
    {"name": "数学", "type": "理科"},
    {"name": "物理", "type": "理科"},
    {"name": "化学", "type": "理科"},
    {"name": "语文", "type": "文科"},
    {"name": "英语", "type": "文科"},
    {"name": "历史", "type": "文科"},
    {"name": "地理", "type": "文科"}
  ]
}
我的尝试

我针对需求编写了以下聚合语句,但结果均不符合预期:

  1. 语句:
db.Subject.aggregate([{"$group":{"_id":"subject.$type","count":{"$sum":1}}}}])

结果:

{ "_id" : "subject.$type", "count" : 7 }
  1. 语句:
db.Subject.aggregate([{"$unwind":"$subject"},{"$group":{"_id":"$type"}}])

结果:

{ "_id" : null }
  1. 语句:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 09:10:56