问题描述
学生可以进行任何测试。 我需要在给定的时间内获得班级中每个学生给出的最后 5 次测试的分数(或 dataLimit )。
在分组之前不能使用限制,因为任何学生都可以进行任何次数的测试。
组操作给出内存限制错误。 “超出了 $group 的内存限制,但不允许外部排序” 目前我已允许使用磁盘空间作为解决方法,但我该如何优化此查询?
{
"_id" : ObjectId("5fa98dfedc0e820001326944"),"school" : "ABC","scholbranch" : "XYZ","class" : "7","section" : "C","studentname" : "Student 1","testmarks" : "90","dateTime" : ISODate("2020-11-09T18:44:14.000Z")
}
Query query = new Query();
List<Criteria> docCriterias = new ArrayList<Criteria>();
docCriterias.add(Criteria.where("school").is(school));
docCriterias.add(Criteria.where("scholbranch").is(scholbranch));
docCriterias.add(Criteria.where("class").is(class));
docCriterias.add(Criteria.where("section").is(section));
docCriterias.add(Criteria.where("dateTime").gte(date1));
docCriterias.add(Criteria.where("dateTime").lt(date2));
Criteria criteria = new Criteria();
criteria.andOperator(docCriterias.toArray(new Criteria[docCriterias.size()]));
int datalimit = noOfData;
MatchOperation matchStage = Aggregation.match(criteria);
SortOperation sortByDateDesc = Aggregation.sort(new Sort(Direction.DESC,"dateTime"));
GroupOperation groupBy = Aggregation.group("$studentname").push(new BasicDBObject("studentname","$studentname")
.append("testmarks","$testmarks").append("dateTime","$dateTime")).as("val");
Projectionoperation projectToMatchModel = Aggregation.project().and("$_id").as("student").and("val")
.slice(datalimit).as("mostRecentVal");
Aggregation aggregation = Aggregation.newAggregation(matchStage,sortByDateDesc,groupBy,projectToMatchModel);
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)