数据聚合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();
}

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何消除img默认的间距

方案一:div{font-size:0};方案二:img{ display:block};方案三:img{vertical-align:top;}方案四&#xff1a;div{ margin-bottom:-3px }; 为什么会有间距呢&#xff1f; 根本原因在于img标签为inline元素&#xff0c;该元素默认垂直对齐方式为以父元素的baseline&#xff0c;但是…

scanf中的%[^\n]%*c格式

scanf 语法: #include <stdio.h> int scanf( const char *format, ... ); 类似函数有 int scanf(const char *format, ...); int fscanf(FILE *stream, const char *format, ...);//指定输入流 int sscanf(const char *str, const char *for…

java有理数类的封装_java实验报告有理数的类封装.doc

java实验报告有理数的类封装华中科技大学文华学院《Java程序设计》实验报告实验三&#xff1a;有理数的类封装专业班级&#xff1a; 通信工程2008级1班姓名&#xff1a;学号&#xff1a;时间&#xff1a;实验三&#xff1a;有理数的类封装1、实验目的&#xff1a;让学生学习使用…

vim基本设置

vim基本配置&#xff1a;包括tab键替换成4个空格 Edit Vim configuration file ".vimrc" in your HOME directory, add below lines: [plain] view plaincopy set et set ci set sw4 set ts4 After new setting take effect, each time you press TAB key, …

在JPA和JDBC中使用存储过程。 嗯,只要使用jOOQ

Java杂志的当前版本由Josh Juneau撰写了有关JDBC和JPA的大数据最佳实践的文章&#xff1a; http : //www.javamagazine.mozaicreader.com/MayJune2016 本文介绍了如何在JDBC中使用存储过程&#xff08;不幸的是&#xff0c;请注意如何关闭资源。即使在Java Magazine的文章中&a…

java hash sha256_Sha256加密

package com.zq.utils.encryption;import java.util.Random;import org.apache.shiro.crypto.hash.Sha256Hash;import com.zq.utils.string.StringUtils;/**** Created by MyEclipse. Author: ChenBin E-mail: chenb8000056.com Date:* 2016-5-23 Time: 下午3:10:37 Company: H…

怎样花两年时间去面试一个人

Joel Spolsky曾经感叹&#xff1a;招聘难&#xff0c;难于上青天&#xff08;此处笔者稍加演绎:)&#xff09;。他有两个辛辣但不乏洞察力的断言&#xff1a;真正的牛人也许一辈子就投大概4次简历&#xff0c;这些家伙一毕业就被好公司抢走了&#xff0c;并且他们的雇主会给他们…

非网络引用element-ui css导致图标无法正常显示的解决办法

https://blog.csdn.net/m0_37893932/article/details/79460652 ******************************************** 前言 官方推荐的css及js引用方式如下: <!-- 引入样式 --> <link rel"stylesheet" href"https://unpkg.com/element-ui/lib/theme-chalk/in…

Java EE与Java SE:Oracle是否放弃了企业软件?

Java Enterprise Edition是全球Java社区中最大的困惑来源之一。 就像《星球大战》和《星际迷航 》之间的区别一样&#xff0c;对于“原力觉醒”是他们在这部电影中看过的第一部电影的人来说。 奇怪的是&#xff0c;即使您有使用EE进行开发的经验&#xff0c;但整个情况通常仍然…

约瑟夫环

约瑟夫环是一个数学的应用问题&#xff1a;已知n个人&#xff08;以编号1&#xff0c;2&#xff0c;3...n分别表示&#xff09;围坐在一张圆桌周围。从编号为k的人开始报数&#xff0c;数到m的那个人出列&#xff1b;他的下一个人又从1开始报数&#xff0c;数到m的那个人又出列…

java链表的数据结构_Java数据结构 获取链表(LinkedList)的第一个和最后一个元素

Java数据结构 获取链表(LinkedList)的第一个和最后一个元素以下实例演示了如何使用 LinkedList 类的 linkedlistname.getFirst() 和 linkedlistname.getLast() 来获取链表的第一个和最后一个元素&#xff1a;Main.java 文件import java.util.LinkedList;public class Main {pub…

第二章:表单和模板

在第一章中&#xff0c;我们学习了使用Tornado创建一个Web应用的基础知识。包括处理函数、HTTP方法以及Tornado框架的总体结构。在这章中&#xff0c;我们将学习一些你在创建Web应用时经常会用到的更强大的功能。 和大多数Web框架一样&#xff0c;Tornado的一个重要目标就是帮助…

C语言main()函数详解

C的设计原则是把函数作为程序的构成模块。main()函数称之为主函数&#xff0c;一个C程序总是从main()函数开始执行的。一、main()函数的形式 在最新的 C99 标准中&#xff0c;只有以下两种定义方式是正确的&#xff1a;int main( void ) /* 无参数形式 */{...return 0;}int ma…

json套json_JSON –拯救杰克逊

json套json有时&#xff0c;您必须使用JavaScript从服务器中获取一些数据&#xff0c; JSON是完成此任务的不错选择。 让我们玩一下JPA揭秘&#xff08;第1集&#xff09;-OneToMany和ManyToOne映射中的Employer – Employee – Benefit示例。 我们将在基于Spring Framework的…

[洛谷P1951]收费站_NOI导刊2009提高(2)

题目大意&#xff1a;有一张$n$个点$m$条边的图&#xff0c;每个点有一个权值$w_i$&#xff0c;有边权&#xff0c;询问从$S$到$T$的路径中&#xff0c;边权和小于$s$&#xff0c;且$\max\limits_{路径经过k}\{w_i\}$最小&#xff0c;输出这个最小值&#xff0c;若到达不了&…

yii mysql 主从_mysql主从同步实践 YII

1、两台服务器互联master、slave 2、master配置&#xff1a; server-id 1 master端ID号 log-bin/data/logbin/mysql-bin 日志路径及文件名 #binlog-do-db cacti 同步cacti&#xff0c;此处关闭的话&#xff0c;就是除不允许的&#xff0c;其它的库均同步。 binlog-ignore-db …

性能与可靠性:Java应用为何像F1汽车

再想一想。 性能和可靠性相关吗&#xff1f; 还是这些东西相互排斥&#xff1f; 我认为是后者。 如今&#xff0c;现实是IT部门将应用程序的性能和可靠性视为同一事物&#xff0c;但这离事实还差得远。 让我们看看一级方程式车队如何管理性能和可靠性。 上赛季迈凯轮本田车队…

BZOJ[1051]受欢迎的牛

Description 每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛&#xff0c;给你M对整数(A,B)&#xff0c;表示牛A认为牛B受欢迎。 这种关系是具有传递性的&#xff0c;如果A认为B受欢迎&#xff0c;B认为C受欢迎&#xff0c;那么牛A也认为牛C受欢迎。你的任务是求出有多少…

C语言文件操作函数大全

clearerr&#xff08;清除文件流的错误旗标&#xff09; 相关函数 feof 表头文件 #include<stdio.h> 定义函数 void clearerr(FILE * stream); 函数说明 clearerr&#xff08;&#xff09;清除参数stream指定的文件流所使用的错误旗标。 返回值   fclose&#xff…

java模拟网易邮箱登录_求赐教:网易邮箱Web端模拟登录看信的加密参数_ntes_nnid、_ntes_nuid...

网易邮箱的模拟登录和收信都非常简单&#xff0c;在阅读邮件的时候需要两个参数&#xff1a;_ntes_nnid 和 _ntes_nuid_ntes_nnid21533f97b25070a31c249f59513ad20c,1492592485123_ntes_nuid21533f97b25070a31c249f59513ad20c32位的&#xff0c;看着像MD5加密。还请各位大神不吝…