我一直在寻找一种方法来限制在使用 MongoDB 集合上的“聚合”时,我正在创建数组并将对象推送到数组中的数量。
我有一个学生集合 - 每个学生都有这些相关键: 本学期所选课程号(仅一个值), 班级百分位数(如果已注册班级则存在,否则为 null), 当前课程成绩(>0 如果已注册班级,否则为 0), 整体平均成绩(GPA), 最高成绩。
我需要将所有从未失败过的学生按班级分组,并将具有高于 80 的 GPA 的学生放入一个数组中,另一个数组包含这些 GPA 不存在的学生,并按照其特定班级的成绩进行排序。
这是我的查询:
db.getCollection("students").aggregate([
{"$match": {
"class_number":
{"$in": [49, 50, 16]},
"grades.curr_class.percentile":
{"$exists": true},
"grades.min": {"$gte": 80},
}},
{"$sort": {"grades.curr_class.score": -1}},
{"$group": {"_id": "$class_number",
"studentsWithHighGPA":
{"$push":
{"$cond": [{"$gte": ["$grades.gpa", 80]},
{"id": "$_id"},
"$$REMOVE"]
}
},
"studentsWithoutHighGPA":
{"$push":
{"$cond": [{"$lt": ["$grades.gpa", 80]},
{"id": "$_id"},
"$$REMOVE"]
},
},
},
},
])
我想做的是限制每个数组中学生的数量。我只想要每个数组中的前16名,但我不知道如何处理。
提前感谢您的回复!
我已经尝试使用不同变量的限制和切片,但似乎都没有起作用。
$facet
不使用索引。2. 这将把所有文档分组成一个大文档,而文档有一个大小限制,这可能会导致查询失败。 - nimrod serok