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

如何在MongoDB中查询嵌套字段的校区科目聚合计数?

实现MongoDB校区科目数量统计的查询方案

可以通过MongoDB的查询和聚合操作实现你的需求,以下是具体方案:

一、查询特定校区的科目数量

1. 查看每个学生在该校区的科目数

直接使用$size操作符获取对应校区科目数组的长度:

db.students.find(
  {},
  { studentName: 1, campusSubjectCount: { $size: "$subjectByCampusName.campus1" } }
)

该查询返回每个学生的姓名,以及他们在campus1修习的科目数量。

2. 统计该校区的总科目数(所有学生的科目数之和)

通过聚合操作求和:

db.students.aggregate([
  {
    $group: {
      _id: null,
      totalCampus1Subjects: { $sum: { $size: "$subjectByCampusName.campus1" } }
    }
  }
])

二、统计所有校区的科目数量

由于校区名是动态键(subjectByCampusName的键为可变的校区名),需先用$objectToArray将对象转为数组,再进行后续处理:

1. 统计每个校区的总科目数(所有学生的科目数之和)

db.students.aggregate([
  // 将校区-科目对象转为[{k: 校区名, v: 科目数组}]格式
  { $project: { campusSubjects: { $objectToArray: "$subjectByCampusName" } } },
  // 展开每个校区的条目
  { $unwind: "$campusSubjects" },
  // 计算每个学生在当前校区的科目数
  { $project: { campusName: "$campusSubjects.k", subjectCount: { $size: "$campusSubjects.v" } } },
  // 按校区分组,累加总科目数
  {
    $group: {
      _id: "$campusName",
      totalSubjects: { $sum: "$subjectCount" }
    }
  },
  // 调整输出字段名,让结果更直观
  { $project: { _id: 0, campusName: "$_id", totalSubjects: 1 } }
])

2. 统计每个校区的去重后科目数量

如果需要统计每个校区有多少种不同的科目(排除重复科目),可调整聚合步骤:

db.students.aggregate([
  { $project: { campusSubjects: { $objectToArray: "$subjectByCampusName" } } },
  { $unwind: "$campusSubjects" },
  // 展开每个校区下的所有科目
  { $unwind: "$campusSubjects.v" },
  // 按校区+科目分组,实现去重
  {
    $group: {
      _id: { campus: "$campusSubjects.k", subject: "$campusSubjects.v" }
    }
  },
  // 按校区分组,统计去重后的科目数量
  {
    $group: {
      _id: "$_id.campus",
      uniqueSubjectCount: { $sum: 1 }
    }
  },
  { $project: { _id: 0, campusName: "$_id", uniqueSubjectCount: 1 } }
])

内容的提问来源于stack exchange,提问作者Raman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:01:07