SpringBoot集成MongoDB(2)|(中级-数据统计、集合、管道处理)


文章目录

  • SpringBoot集成MongoDB(2)|(中级-数据统计、集合、管道处理)
  • @[TOC]
  • 前言
  • 一、MongoDB是什么?
  • 二、集成步骤
  • 1.依赖引入
  • 2.文件配置
  • 3.聚合管道(Aggregation Pipeline)
  • 4.服务层代码
  • 总结

前言

本章节主要介绍SpringBoot项目集成MongoDB的一些聚合统计相关知识,包括集成版本、依赖、集成方式、以及多管道使用。前提需要对Springboot项目、对MongoDB有一定的了解。

一、MongoDB是什么?

mongodb和redis一样是一种NoSQL存储介质,存储读取快,但实质上它又是一种介于关系型数据库(如mysql,数据存在磁盘中)和非关系型数据库(如redis,数据存在内存中)的介质,它数据存在磁盘,但读取又借助内存机制映射进行,所以集成了关系型和非关系型的各自优点。它的设计是基于分布式储存的,可用集群部署来分压

二、集成步骤

1.依赖引入

pom依赖如下,主要列出SpringBoot依赖版本以及MongoDB版本,其他需要依赖自行添加

<!-- Springboot 版本 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.7</version>
        <relativePath/>
    </parent>
    
     <!-- mongodb 依赖 -->
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-data-mongodb</artifactId>
     </dependency>

2.文件配置

yml配置,此处为单机配置,集群模式uri

spring:
  data:
    mongodb:
      uri: mongodb://用户名:密码@127,。0.0.1:port/库名?authSource=admin&authMechanism=SCRAM-SHA-1

3.聚合管道(Aggregation Pipeline)

通过mongoTemplate对象对mongoDb数据库进行聚合操作,使用聚合管道可对集合中的文档进行变换和组合。应用场景:表关联查询、数据的统计

下面引用官网对管道用法的描述插图,可以看出管道操作类似于对数据的层层处理,就像自来水厂,将原始水池的水通过水管连接到不同的处理池,每个处理池都会接收上层水池的水,处理后流往下层的水池,最终达到水的净化目的。

mongodb上亿数据 netcore serilog mongodb数据统计_spring boot


Aggregation.match():构建查询条件管道

Aggregation.lookup():构建关联查询管道

Aggregation.unwind():构建聚合管道

Aggregation.group():构建分组统计管道

Aggregation.sort():构建排序管道

Aggregation.skip():跳过查询结果前xx条

Aggregation.limit():获取查询结构xx条


4.服务层代码

通过mongoTemplate对象对mongoDb数据库进行操作,mongoTemplate有springboot容器创建管理,用户不需要进行配置,使用的时候注入即可,controller层没有贴入,可自行编写。

public IPage<DemoDto> count(Query param, int pageNo, int pageSize) {
        pageNo = Math.max(pageNo, 1);

        //构建查询管道
        AggregationOperation statsMatchOp = buildQAStatsMatchOp(param);
        //构建联表查询管道
        AggregationOperation lookupOp = Aggregation.lookup("#{关联表名}", "#{关联字段}", "#{关联表字段}", "#{关联表取值}");
        //聚合管道,关联的字段聚合起来
        AggregationOperation unwindOp = Aggregation.unwind("#{关联表取值}");
        //统计管道
        AggregationOperation groupOp = Aggregation.group("dept")
                .first("name").as("name")
                .first("type").as("type")
                .sum("count").as("count");
        //构造分页的聚合查询
        Aggregation pagedAgg = newAggregation(statsMatchOp,
                lookupOp,
                unwindOp,
                groupOp,
                Aggregation.sort((Sort.Direction.ASC, "count"),  //用于排序
                Aggregation.skip((long) (pageNo - 1) * pageSize),  //跳过前多少条数据
                Aggregation.limit(pageSize)); //获取多少条数据
        List<DemoDto> demoDtos = mongoTemplate.aggregate(pagedAgg, "demo", DemoDto.class)
                .getMappedResults();
        return PageUtil.page(totalSize, pageNo, pageSize);
    }
    MatchOperation buildQAStatsMatchOp(Query param) {
        Criteria criteria = new Criteria().and("date").is(date);
        return Aggregation.match(criteria);
    }

总结

以上就是SpringBoot集成MongoDb数据库内容实现管道聚合操作。该过程主要安装管道定义顺序依次完成数据的筛选处理。需要源代码的可以留言获取。