微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

优化查询聚合框架mongodb

如何解决优化查询聚合框架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 举报,一经查实,本站将立刻删除。