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

数据聚合Spring Data MongoDB:嵌套结果相关推荐

  1. Spring Data MongoDB 使用group和unwind实现对数组数据进行简单统计

    Spring Data MongoDB 使用group和unwind实现对数组数据进行简单统计 先简单交代一下需求:新高考政策下,高中学生可以组合选择自己喜欢的三门副科,选科结束后教务需要看到这次选科 ...

  2. Spring data MongoDB 系列之一连接数据库并 插入数据

    前言 最近开发新项目中用到MongoDB,为方便以后使用便记录下用法. 本文的数据库操作是以model对象进行展开,但是MongoDB是接受以Json,Map等为对象的操作的. (本人的项目中是以Js ...

  3. SpringBoot 集成 Spring Data Mongodb 操作 MongoDB 详解

    一.MongoDB 简介 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,且与关系数据库的最为相像的.它支持的数据结构非常松散,是类似 json 的 bso ...

  4. Spring认证中国教育管理中心-Spring Data MongoDB教程五

    原标题:Spring认证中国教育管理中心-Spring Data MongoDB教程五(内容来源:Spring中国教育管理中心) 11.6.5.GeoJSON 支持 MongoDB 支持GeoJSON ...

  5. mongodb数据库java接口,MongoDB —— 使用Spring Data MongoDB操作数据库

    我们使用Spring Data MongoDB可以方便的在Spring boot项目中操作MongoDB 文档地址:https://docs.spring.io/spring-boot/docs/2. ...

  6. 使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南

    1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...

  7. Spring Data MongoDB教程

    在当今世界,尽快启动并运行应用程序非常重要. 该应用程序还应该易于开发和维护. Spring是这样的框架,它提供了与许多不同框架的集成的简便性,这使得使用Spring开发应用程序变得容易. 一种这样的 ...

  8. Spring Data MongoDB示例

    Spring Data MongoDB示例 欢迎使用Spring Data MongoDB示例.Spring Data MongoDB是将Spring Framework与最广泛使用的NoSQL数据库 ...

  9. spring data mongodb CURD

    一.添加 Spring  Data  MongoDB 的MongoTemplate提供了两种存储文档方式,分别是save和insert方法,这两种的区别: (1)save :我们在新增文档时,如果有一 ...

最新文章

  1. 基于NB-IoT的智慧路灯监控系统(NB-IoT专栏—实战篇4:PC应用开发)
  2. 提升tomcat服务器性能的七条经验
  3. linux一切皆文件之tty字符设备(深入理解sshd创建pty的过程) (五)
  4. PHP+MYSQL的OA为何没有Java的值钱?
  5. SQL SERVER 通用分页存储过程
  6. 《leetcode》longest-consecutive-sequence
  7. mysql mode_mysql中的sql_mode
  8. java中ssm付款代码,ssm实现支付宝支付功能(图文详解)
  9. LeetCode 1860. 增长的内存泄露(等差数列)
  10. 一般是一个较为复杂的 飞鸽传书 对象
  11. 超cool的firefox插件之PicLens
  12. Windows 禁止mysql 自动更新
  13. 应届毕业生到底签不签三方协议好?
  14. php如何安装,php如何安装freetype
  15. Java编译带包文件
  16. delphi相关文件扩展名
  17. 使用Titan Framework搭建一个集群Demo
  18. EdrawMax使用方法
  19. 从零开始学编程(所以说英语也是零)
  20. 【CodeVS 1222】信与信封的问题 随机化+treat Hungery

热门文章

  1. Ehcache介绍及整合Spring实现高速缓存
  2. Github Pages + Jekyll 独立博客一小时快速搭建上线指南
  3. SpringMVC(笔记)
  4. 部署kafka kafka的service容器和zookeeper kafka客户端 Elasticsearch的客户端
  5. rabbitmq启动失败-报Failed to load advanced configuration file解决方法
  6. java异常——异常分类+声明已检查异常+如何抛出异常+自定义异常类
  7. 缓存与数据库的一致性:先操作缓存还是先操作数据库?
  8. 在Spring Boot中使用切面统一处理自定义的异常
  9. openjdk-7支持版本_长期支持对OpenJDK意味着什么?
  10. spock 集成测试_使用Spock 1.2简化对遗留应用程序的集成测试