1引言
在上一篇文章中,我们构建了聚合管道的基本示例。 如果您需要有关如何创建项目和配置应用程序的更多详细信息,也许您想看看使用Spring Data MongoDB和Spring Boot进行数据聚合 。 在本文中,我们将重点研究一个用例,在这种情况下,将结果的一部分分组在一个嵌套对象中是有意义的。
我们的测试数据是足球运动员的集合,其中包含有关他们所属的联赛以及进球数的数据。 该文件将是这样的:
@Document
public class ScorerResults {@Idprivate final String player;private final String country;private final String league;private final int goals;public ScorerResults(String player, String country, String league, int goals) {this.player = player;this.country = country;this.league = league;this.goals = goals;}//Getters and setters
}
知道每个联赛打进多少球可能很有趣。 另外,谁是联盟的最佳射手。 在下一节中,我们将不使用嵌套对象来实现第一个简单示例。
您可以在我的Github存储库中找到所有这些示例的源代码。
2基本示例
我们可以使用以下类来存储每个联赛的结果:
public class ScorerNotNestedStats {private String league;private int totalGoals;private String topPlayer;private String topCountry;private int topGoals;//Getters and setters
}
为了检索得分最高的得分手,我们首先需要按进球数对文件进行排序,然后按联赛对它们进行分组。 在存储库中,通过以下方法实现管道的这两个阶段:
private SortOperation buildSortOpertation() {return sort(Sort.Direction.DESC, "goals");
}private GroupOperation buildGroupOperation() {return group("league").first("league").as("league").sum("goals").as("totalGoals").first("player").as("topPlayer").first("goals").as("topGoals").first("country").as("topCountry");
}
那应该做。 让我们使用Spring的mongoTemplate汇总结果:
public List<ScorerNotNestedStats> aggregateNotNested() {SortOperation sortOperation = buildSortOpertation();GroupOperation groupOperation = buildGroupOperation();return mongoTemplate.aggregate(Aggregation.newAggregation(sortOperation,groupOperation), ScorerResults.class, ScorerNotNestedStats.class).getMappedResults();
}
如果我们检索西班牙联赛的统计数据,则会得到以下结果:
尽管这很公平,但是我对整个结果类中分散的所有头号得分手的信息感到不满意。 我认为,如果我们可以将所有计分员的数据封装到一个嵌套对象中,那将更加有意义。 幸运的是,我们可以在聚合过程中直接做到这一点。
3嵌套结果
Spring Data的嵌套方法旨在在投影阶段创建子文档。 这将使我们能够将顶级目标球类创建为输出结果类的属性:
ProjectionOperation projectionOperation = project("totalGoals").and("league").as("league").and("topScorer").nested(bind("name", "topPlayer").and("goals", "topGoals").and("country", "topCountry"));
在上面的行中,嵌套方法topscorer被嵌套,该嵌套文档将包含有关当前联赛最佳射手得分的所有数据。 使用bind方法(topPlayer,topGoals和topCountry)将其属性映射到输出类。
MongoTemplate的调用重用了我们先前的排序和分组操作,然后添加了投影操作:
return mongoTemplate.aggregate(Aggregation.newAggregation(sortOperation,groupOperation,projectionOperation
), ScorerResults.class, ScorerStats.class).getMappedResults();
执行此查询将得到更紧凑的结果,所有最重要的进球者相关数据都包装在其自己的类中:
4。结论
Spring Data MongoDB嵌套方法对于通过聚合查询创建结构良好的输出结果非常有用。 在聚合过程中执行此步骤有助于避免使用Java代码对结果进行后处理。
我正在Google Plus和Twitter上发布我的新帖子。 如果您要更新新内容,请关注我。
翻译自: https://www.javacodegeeks.com/2016/05/data-aggregation-spring-data-mongodb-nested-results.html