SpringBoot系列之MongoDB Aggregations用法详解


Posted in MongoDB onFebruary 12, 2022

1、前言

在上一章的学习中,我们知道了Spring Data MongoDB的基本用法,但是对于一些聚合操作,还是不熟悉的,所以本博客介绍一些常用的聚合函数

2、什么是聚合?

MongoDB 中使用聚合(Aggregations)来分析数据并从中获取有意义的信息。在这个过程,一个阶段的输出作为输入传递到下一个阶段

常用的聚合函数

聚合函数 SQL类比 描述
project SELECT 类似于select关键字,筛选出对应字段
match WHERE 类似于sql中的where,进行条件筛选
group GROUP BY 进行group by分组操作
sort ORDER BY 对应字段进行排序
count COUNT 统计计数,类似于sql中的count
limit LIMIT 限制返回的数据,一般用于分页
out SELECT INTO NEW_TABLE 将查询出来的数据,放在另外一个document(Table) , 会在MongoDB数据库生成一个新的表

3、环境搭建

  • 开发环境
  • JDK 1.8
  • SpringBoot2.2.1
  • Maven 3.2+
  • 开发工具
  • IntelliJ IDEA
  • smartGit
  • Navicat15

使用阿里云提供的脚手架快速创建项目:
https://start.aliyun.com/bootstrap.html

SpringBoot系列之MongoDB Aggregations用法详解

也可以在idea里,将这个链接复制到Spring Initializr这里,然后创建项目

SpringBoot系列之MongoDB Aggregations用法详解

jdk选择8的

SpringBoot系列之MongoDB Aggregations用法详解

选择spring data MongoDB

SpringBoot系列之MongoDB Aggregations用法详解

4、数据initialize

private static final String DATABASE = "test";
private static final String COLLECTION = "user";
private static final String USER_JSON = "/userjson.txt";
private static MongoClient mongoClient;
private static MongoDatabase mongoDatabase;
private static MongoCollection<Document> collection;

@BeforeClass
public static void init() throws IOException {
    mongoClient = new MongoClient("192.168.0.61", 27017);
    mongoDatabase = mongoClient.getDatabase(DATABASE);
    collection = mongoDatabase.getCollection(COLLECTION);
    collection.drop();
    InputStream inputStream = MongodbAggregationTests.class.getResourceAsStream(USER_JSON);
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    reader.lines()
            .forEach(l->collection.insertOne(Document.parse(l)));
    reader.close();
}

5、例子应用

本博客,不每一个函数都介绍,通过一些聚合函数配置使用的例子,加深读者的理解

统计用户名为User1的用户数量

@Test
 public void matchCountTest() {
     Document first = collection.aggregate(
             Arrays.asList(match(Filters.eq("name", "User1")), count()))
             .first();
     log.info("count:{}" , first.get("count"));
     assertEquals(1 , first.get("count"));
 }

skip跳过记录,只查看后面5条记录

@Test
 public void skipTest() {
      AggregateIterable<Document> iterable = collection.aggregate(Arrays.asList(skip(5)));
      for (Document next : iterable) {
          log.info("user:{}" ,next);
      }

  }

对用户名进行分组,避免重复,group第一个参数$name类似于group by name,调用Accumulatorssum函数,其实类似于SQL,SELECT name ,sum(1) as sumnum FROMusergroup by name

@Test
 public void groupTest() {
     AggregateIterable<Document> iterable = collection.aggregate(Arrays.asList(
             group("$name" , Accumulators.sum("sumnum" , 1)),
             sort(Sorts.ascending("_id"))
             ));
     for (Document next : iterable) {
         log.info("user:{}" ,next);
     }

 }

参考资料

MongoDB 聚合 https://www.runoob.com/

MongoDB Aggregations Using Java

到此这篇关于SpringBoot系列之MongoDB Aggregations用法的文章就介绍到这了,更多相关SpringBoot MongoDB Aggregations用法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MongoDB 相关文章推荐
MongoDB使用profile分析慢查询的步骤
Apr 30 MongoDB
MongoDB数据库的安装步骤
Jun 18 MongoDB
详解MongoDB的条件查询和排序
Jun 23 MongoDB
浅析MongoDB之安全认证
Jun 26 MongoDB
centos8安装MongoDB的详细过程
Oct 24 MongoDB
剖析后OpLog订阅MongoDB的数据变更就没那么难了
Feb 24 MongoDB
MongoDB数据库部署环境准备及使用介绍
Mar 21 MongoDB
MongoDB修改oplog大小的四种方法
Apr 11 MongoDB
NoSQL优缺点与MongoDB数据库简介
Jun 05 MongoDB
MongoDB连接数据库并创建数据等使用方法
springboot + mongodb 通过经纬度坐标匹配平面区域的方法
Nov 01 #MongoDB
centos8安装MongoDB的详细过程
关于CentOS 8 搭建MongoDB4.4分片集群的问题
MongoDB日志切割的三种方式总结
Sep 15 #MongoDB
mongodb清除连接和日志的正确方法分享
Sep 15 #MongoDB
阿里云服务器部署mongodb的详细过程
Sep 04 #MongoDB
You might like
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
PHP 最大运行时间 max_execution_time修改方法
2010/03/08 PHP
初学PHP的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
2017/07/03 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
2017/12/21 PHP
PHP实现正则表达式分组捕获操作示例
2018/02/03 PHP
PHP命令Command模式用法实例分析
2018/08/08 PHP
精解window.setTimeout()&amp;window.setInterval()使用方式与参数传递问题!
2007/11/23 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
2016/05/19 Javascript
Boostrap实现的登录界面实例代码
2016/10/09 Javascript
npm scripts 使用指南详解
2018/10/08 Javascript
微信小程序新手教程之页面打开数量限制
2019/03/03 Javascript
Vue $mount实战之实现消息弹窗组件
2019/04/22 Javascript
深入解析Vue源码实例挂载与编译流程实现思路详解
2019/05/05 Javascript
解决vue初始化项目时,一直卡在Project description上的问题
2019/10/31 Javascript
跟老齐学Python之眼花缭乱的运算符
2014/09/14 Python
Python之Scrapy爬虫框架安装及使用详解
2017/11/16 Python
使用pandas对两个dataframe进行join的实例
2018/06/08 Python
Python 新建文件夹与复制文件夹内所有内容的方法
2018/10/27 Python
python 去除二维数组/二维列表中的重复行方法
2019/01/23 Python
pyqt 实现在Widgets中显示图片和文字的方法
2019/06/13 Python
浅谈python中统计计数的几种方法和Counter详解
2019/11/07 Python
详解Python爬虫爬取博客园问题列表所有的问题
2021/01/18 Python
使用豆瓣源来安装python中的第三方库方法
2021/01/26 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
2017/07/24 HTML / CSS
德国家用电器购物网站:Premiumshop24
2019/08/22 全球购物
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
销售团队获奖感言
2014/08/14 职场文书
美德少年事迹材料500字
2014/08/19 职场文书
创新社会管理心得体会
2014/09/12 职场文书
2014年司机工作总结
2014/11/21 职场文书
小鞋子观后感
2015/06/05 职场文书
python数据分析之用sklearn预测糖尿病
2021/04/22 Python
以下牛机,你有几个
2022/04/05 无线电
html解决浏览器记住密码输入框的问题
2023/05/07 HTML / CSS