如何在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
相关产品推荐
相关产品推荐

