数据聚合Spring Data MongoDB:嵌套结果
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:嵌套结果相关推荐
- Spring Data MongoDB 使用group和unwind实现对数组数据进行简单统计
Spring Data MongoDB 使用group和unwind实现对数组数据进行简单统计 先简单交代一下需求:新高考政策下,高中学生可以组合选择自己喜欢的三门副科,选科结束后教务需要看到这次选科 ...
- Spring data MongoDB 系列之一连接数据库并 插入数据
前言 最近开发新项目中用到MongoDB,为方便以后使用便记录下用法. 本文的数据库操作是以model对象进行展开,但是MongoDB是接受以Json,Map等为对象的操作的. (本人的项目中是以Js ...
- SpringBoot 集成 Spring Data Mongodb 操作 MongoDB 详解
一.MongoDB 简介 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,且与关系数据库的最为相像的.它支持的数据结构非常松散,是类似 json 的 bso ...
- Spring认证中国教育管理中心-Spring Data MongoDB教程五
原标题:Spring认证中国教育管理中心-Spring Data MongoDB教程五(内容来源:Spring中国教育管理中心) 11.6.5.GeoJSON 支持 MongoDB 支持GeoJSON ...
- mongodb数据库java接口,MongoDB —— 使用Spring Data MongoDB操作数据库
我们使用Spring Data MongoDB可以方便的在Spring boot项目中操作MongoDB 文档地址:https://docs.spring.io/spring-boot/docs/2. ...
- 使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南
1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...
- Spring Data MongoDB教程
在当今世界,尽快启动并运行应用程序非常重要. 该应用程序还应该易于开发和维护. Spring是这样的框架,它提供了与许多不同框架的集成的简便性,这使得使用Spring开发应用程序变得容易. 一种这样的 ...
- Spring Data MongoDB示例
Spring Data MongoDB示例 欢迎使用Spring Data MongoDB示例.Spring Data MongoDB是将Spring Framework与最广泛使用的NoSQL数据库 ...
- spring data mongodb CURD
一.添加 Spring Data MongoDB 的MongoTemplate提供了两种存储文档方式,分别是save和insert方法,这两种的区别: (1)save :我们在新增文档时,如果有一 ...
最新文章
- 基于NB-IoT的智慧路灯监控系统(NB-IoT专栏—实战篇4:PC应用开发)
- 提升tomcat服务器性能的七条经验
- linux一切皆文件之tty字符设备(深入理解sshd创建pty的过程) (五)
- PHP+MYSQL的OA为何没有Java的值钱?
- SQL SERVER 通用分页存储过程
- 《leetcode》longest-consecutive-sequence
- mysql mode_mysql中的sql_mode
- java中ssm付款代码,ssm实现支付宝支付功能(图文详解)
- LeetCode 1860. 增长的内存泄露(等差数列)
- 一般是一个较为复杂的 飞鸽传书 对象
- 超cool的firefox插件之PicLens
- Windows 禁止mysql 自动更新
- 应届毕业生到底签不签三方协议好?
- php如何安装,php如何安装freetype
- Java编译带包文件
- delphi相关文件扩展名
- 使用Titan Framework搭建一个集群Demo
- EdrawMax使用方法
- 从零开始学编程(所以说英语也是零)
- 【CodeVS 1222】信与信封的问题 随机化+treat Hungery
热门文章
- Ehcache介绍及整合Spring实现高速缓存
- Github Pages + Jekyll 独立博客一小时快速搭建上线指南
- SpringMVC(笔记)
- 部署kafka kafka的service容器和zookeeper kafka客户端 Elasticsearch的客户端
- rabbitmq启动失败-报Failed to load advanced configuration file解决方法
- java异常——异常分类+声明已检查异常+如何抛出异常+自定义异常类
- 缓存与数据库的一致性:先操作缓存还是先操作数据库?
- 在Spring Boot中使用切面统一处理自定义的异常
- openjdk-7支持版本_长期支持对OpenJDK意味着什么?
- spock 集成测试_使用Spock 1.2简化对遗留应用程序的集成测试