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 23 MongoDB
浅析MongoDB之安全认证
Jun 26 MongoDB
阿里云服务器部署mongodb的详细过程
Sep 04 MongoDB
关于CentOS 8 搭建MongoDB4.4分片集群的问题
Oct 24 MongoDB
MongoDB使用场景总结
Feb 24 MongoDB
MongoDB数据库部署环境准备及使用介绍
Mar 21 MongoDB
MongoDB误操作后使用oplog恢复数据
Apr 11 MongoDB
MongoDB支持的数据类型
Apr 11 MongoDB
MongoDB修改oplog大小的四种方法
Apr 11 MongoDB
MongoDB数据库之添删改查
Apr 26 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/07/30 PHP
php中检查文件或目录是否存在的代码小结
2012/10/22 PHP
php function用法如何递归及return和echo区别
2014/03/07 PHP
PHP中new static() 和 new self() 的区别介绍
2015/01/09 PHP
js 第二代身份证号码的验证机制代码
2011/05/12 Javascript
Js控制滑轮左右滑动实例
2015/02/13 Javascript
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
纯JS代码实现气泡效果
2016/05/04 Javascript
JavaScript算法系列之快速排序(Quicksort)算法实例详解
2016/09/04 Javascript
jQuery插件扩展实例【添加回调函数】
2016/11/26 Javascript
JS实现控制图片显示大小的方法【图片等比例缩放功能】
2017/02/18 Javascript
在javaScript中检测数据类型的几种方式小结
2017/03/04 Javascript
关于jquery layui弹出层的使用方法
2018/04/21 jQuery
Vue实现类似Spring官网图片滑动效果方法
2019/03/01 Javascript
vue 实现websocket发送消息并实时接收消息
2019/12/09 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
[35:34]Liquid vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python正则表达式教程之一:基础篇
2017/03/02 Python
Python实现控制台中的进度条功能代码
2017/12/22 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
从0开始的Python学习016异常
2019/04/08 Python
pycharm设置鼠标悬停查看方法设置
2019/07/29 Python
文件上传服务器-jupyter 中python解压及压缩方式
2020/04/22 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
2020/08/27 Python
CSS3实现王者荣耀匹配人员加载页面的方法
2019/04/16 HTML / CSS
在加拿大在线租赁和购买电子游戏:Game Access
2019/09/02 全球购物
北承题目(C++)
2012/05/16 面试题
自我鉴定怎么写
2014/01/12 职场文书
法定代表人资格证明书
2014/09/11 职场文书
大学军训通讯稿
2015/07/18 职场文书
期中考试后的感想
2015/08/07 职场文书
事业单位岗位说明书
2015/10/08 职场文书
如何写好竞聘报告
2019/04/03 职场文书
如何写好活动总结
2019/06/21 职场文书
详解前端任务构建利器Gulp.js使用指南
2021/04/30 Javascript
Python 操作pdf pdfplumber读取PDF写入Exce
2022/08/14 Python