网站开发如何进行管理,wordpress 访问速度慢,紫色网站模板,一键生成简历1引言 在上一篇文章中#xff0c;我们构建了聚合管道的基本示例。 如果您需要有关如何创建项目和配置应用程序的更多详细信息#xff0c;也许您想看看使用Spring Data MongoDB和Spring Boot进行数据聚合 。 在本文中#xff0c;我们将重点研究一个用例#xff0c;在这种情况… 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 ListScorerNotNestedStats 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方法topPlayertopGoals和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