优化查询聚合框架mongodb

问题描述

学生可以进行任何测试。 我需要在给定的时间内获得班级中每个学生给出的最后 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 (将#修改为@)