数据聚合Spring Data MongoDB:嵌套结果

1引言

在上一篇文章中,我们构建了聚合管道的基本示例。 如果您需要有关如何创建项目和配置应用程序的更多详细信息,也许您想看看使用Spring Data MongoDB和Spring Boot进行数据聚合 。 在本文中,我们将重点研究一个用例,在这种情况下,将结果的一部分分组在一个嵌套对象中是有意义的。

我们的测试数据是足球运动员的集合,其中包含有关他们所属的联赛以及进球数的数据。 该文件将是这样的:

@Document
public class ScorerResults {
  
  @Id
  private 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();
}

如果我们检索西班牙联赛的统计数据,则会得到以下结果:

AggregationNotNestedResult

尽管这很公平,但是我对整个结果类中分散的所有头号得分手的信息感到不满意。 我认为,如果我们可以将所有计分员的数据封装到一个嵌套对象中,那将更加有意义。 幸运的是,我们可以在聚合过程中直接做到这一点。

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();

执行此查询将得到更紧凑的结果,所有最重要的进球者相关数据都包装在其自己的类中:

AggregationNestedResult

4。结论

Spring Data MongoDB嵌套方法对于通过聚合查询创建结构良好的输出结果非常有用。 在聚合过程中执行此步骤有助于避免使用Java代码对结果进行后处理。

我正在Google Plus和Twitter上发布我的新帖子。 如果您要更新新内容,请关注我。

翻译自: https://www.javacodegeeks.com/2016/05/data-aggregation-spring-data-mongodb-nested-results.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值