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数据库常用的10条操作命令
Jun 18 MongoDB
MongoDB 常用的crud操作语句
Jun 20 MongoDB
浅析MongoDB之安全认证
Jun 26 MongoDB
常用的MongoDB查询语句的示例代码
Jul 25 MongoDB
阿里云服务器部署mongodb的详细过程
Sep 04 MongoDB
centos8安装MongoDB的详细过程
Oct 24 MongoDB
MongoDB连接数据库并创建数据等使用方法
Nov 27 MongoDB
mongoDB数据库索引快速入门指南
Mar 23 MongoDB
SpringBoot集成MongoDB实现文件上传的步骤
Apr 18 MongoDB
MongoDB数据库之添删改查
Apr 26 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中如何判断AJAX提交的数据
2012/02/05 PHP
数组与类使用PHP的可变变量名需要的注意的问题
2013/06/20 PHP
PHP中file_exists函数不支持中文名的解决方法
2014/07/26 PHP
10款PHP开源商城系统汇总介绍
2015/07/23 PHP
JavaScript将数据转换成整数的方法
2014/01/04 Javascript
JQuery实现鼠标移动到图片上显示边框效果
2014/01/09 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
2016/05/12 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
2016/06/12 Javascript
js实现一键复制功能
2017/03/16 Javascript
mui上拉加载功能实例详解
2017/04/13 Javascript
微信小程序实战之自定义抽屉菜单(7)
2017/04/18 Javascript
微信小程序如何获取群聊的openGid以及名称详解
2019/07/17 Javascript
vue抽出组件并传值实例
2020/07/31 Javascript
Pyramid添加Middleware的方法实例
2013/11/27 Python
Django与JS交互的示例代码
2017/08/23 Python
Python基于回溯法子集树模板实现图的遍历功能示例
2017/09/05 Python
Python实现判断一行代码是否为注释的方法
2018/05/23 Python
python实现逆序输出一个数字的示例讲解
2018/06/25 Python
python getpass模块用法及实例详解
2019/10/07 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
2019/10/30 Python
pandas 空数据处理方法详解
2019/11/02 Python
解决c++调用python中文乱码问题
2020/07/29 Python
python实现简单的井字棋游戏(gui界面)
2021/01/22 Python
Python中使用Selenium环境安装的方法步骤
2021/02/22 Python
利用CSS3的线性渐变linear-gradient制作边框的示例
2016/06/02 HTML / CSS
英国著名的化妆品折扣网站:Allbeauty.com
2016/07/21 全球购物
天逸系统(武汉)有限公司Java笔试题
2015/12/29 面试题
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2012/04/17 面试题
加工操作管理制度
2014/01/19 职场文书
餐厅总厨求职信
2014/03/04 职场文书
电子商务专业应届生求职信
2014/05/28 职场文书
开学第一天的感想
2015/08/10 职场文书
幼儿园小班开学寄语(2016秋季)
2015/12/03 职场文书
实体类或对象序列化时,忽略为空属性的操作
2021/06/30 Java/Android
Pyqt5将多个类组合在一个界面显示的完整示例
2021/09/04 Python