• MongoDB从入门到精通、Springboot整合MongoDB


    一、前言

    MongoDB是一款比较常见的NoSQL数据库,它以其灵活性、可伸缩性和高性能而闻名。

    MongoDB的主要特点是它采用了文档型数据存储模型,允许开发人员以非常自然的方式组织和存储数据。

    当一些表在MySQL查询效率不高时,可以转为MongoDB,解决数据多查询慢的情况!

    下面我们在详细的了解一下吧!

    二、非关系数据库

    说到MongoDB,就顺便说一下非关系数据库的常见的几种:

    类型名称介绍
    文档数据库MongoDB使用BSON(二进制JSON)格式存储数据,适用于半结构化数据和复杂查询。
    键值数据库Redis用于缓存和快速数据访问,支持复杂的数据结构,如字符串、列表、哈希等。
    列式数据库ClickHouse一个开源的列式数据库管理系统,专门设计用于高性能的数据分析和OLAP(联机分析处理)工作负载。
    图数据库Neo4j用于存储和查询图形数据,如社交网络关系、知识图谱等。
    搜索引擎Elasticsearch分布式搜索和分析引擎,适用于全文搜索、日志分析和实时数据分析。

    有想具体了解的可以看一下小编之前写的文章:

    列式数据库ClickHouse,大宽表聚合、报表一下全搞定

    Docker搭建Elasticsearch、Kibana、Logstash 同步mysql数据到ES

    redis和mysql如何保持缓存一致性?阿里Canal告诉你

    分布式进阶:Springboot自定义注解优雅的实现Redisson分布式锁

    三、MongoDB介绍

    MongoDB是一个开源的文档型数据库管理系统,它属于非关系型数据库的一种,主要存储半结构化或无结构化数据,并提供灵活的数据建模和查询能力。

    MongoDB中的一条记录就是一个文档,它是由字段和值对组成的数据结构。MongoDB 文档类似于 JSON 对象。字段的值可以包括其他文档、数组和文档数组

    在这里插入图片描述

    使用文档的优点是:

    • 文档对应于许多编程语言中的本机数据类型。

    • 嵌入式文档和数组减少了对昂贵连接的需求。

    • 动态模式支持流畅的多态性。

    我们来比对MySQL说一下MongoDB的概念:

    最大的概念数据库其实可以理解为一样的,只不过MySQL数据库里放的是表,MongoDB里放得是文档集合。

    所以:表(Table)文档集合(Collection)可以理解类似的,存储的形式不一样

    在细化的概念就是:
    行(Row):行是表中的记录,它们包含特定的字段和值
    文档(Document):文档是JSON格式的数据,它们包含了数据字段和相应的值

    在这里插入图片描述

    四、特点

    1. 高性能

    MongoDB 提供高性能的数据持久性。特别是下面两个方面:

    • 对嵌入式数据模型的支持减少了数据库系统上的 I/O 活动。

    • 索引支持更快的查询,并且可以包含嵌入文档和数组中的键。

    2. 查询接口

    MongoDB 查询 API 支持读写操作 (CRUD)以及:

    • 复杂的数据聚合

    • 文本搜索和地理空间查询

    3. 高可用性

    MongoDB 的复制工具称为副本集,它提供:

    • 自动故障转移

    • 数据冗余

    副本集是一组维护相同数据集的 MongoDB 服务器,提供冗余并提高数据可用性。

    4. 水平扩展性

    MongoDB 提供水平可扩展性作为其核心 功能的一部分:

    • 分片将数据分布在机器集群上

    • 从 3.4 开始,MongoDB 支持基于分片键创建数据区域

    在平衡集群中,MongoDB 将区域覆盖的读写操作仅定向到该区域内的分片。

    5. 支持多个存储引擎

    MongoDB 支持多种存储引擎:

    • WiredTiger 存储引擎(包括对 静态加密的支持)

    • 内存存储引擎

    此外,MongoDB提供了可插拔的存储引擎API,允许第三方为MongoDB开发存储引擎。

    五、应用场景

    日志和审计数据:MongoDB可以使用MongoDB存储应用程序日志、审计数据、操作日志、错误日志等。

    产品和目录信息:MongoDB适用于电子商务平台,用于存储产品信息、价格、库存以及目录结构。

    时间序列数据:MongoDB可用于存储时间序列数据,如传感器读数、市场行情、监控数据和日志。

    实时事件数据:实时事件数据,如点击流分析、用户行为追踪、社交媒体活动等,可以在MongoDB中存储和分析。

    地理信息数据:如果你需要存储地理信息数据,如位置坐标、地图数据或地理空间信息,MongoDB的地理空间功能非常有用。

    会话数据:MongoDB可以用于存储Web应用程序的会话数据,以实现用户身份验证和会话管理。

    用户数据:你可以使用MongoDB存储用户配置文件、个人信息、登录凭据等用户相关数据。

    大数据分析:MongoDB在大数据分析领域也有广泛应用,可以存储和分析大规模数据集,支持实时分析和报告。

    博客和内容管理:MongoDB适合存储博客文章、评论、标签和多媒体内容。

    当然有些东西Redis也可以实现,具体情况在根据公司情况进行选择,不要死板哈!

    六、安装与Navicat连接

    1. 安装

    本次使用Docker安装比较省心,当然也可以下载客户端装在Linux中,不太建议装在Windows中。

    不想装虚拟机的话,装也是可以的,就不带大家安装了,直接给地址自行下载哈:

    mongodb下载地址

    目前最新版本:7.0.1

    运行命令之前,需要在宿主机上创建文件夹用于挂载数据,创建完文件夹记得给修改权限。

    自己测试玩,可以不挂载,生产上也不太建议使用Docker安装!

    docker run -d  --name mongodb  --restart always -p 27017:27017 -v /data/mongo:/data/db mongo
    
    • 1

    2. 测试连接

    我们没有设置密码,大家也可以设置一下!

    在这里插入图片描述
    刚刚创建的是一个空的数据库,需要我们自己创建一个数据库:

    在这里插入图片描述

    创建完成:

    在这里插入图片描述

    对于数据库API操作大家可以看文档来走一遍,这里就不具体演示,我们还是以在Springboot程序中来使用演示为主:

    MongoDB API文档

    六、整合Springboot

    1. 导入依赖

    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-data-mongodbartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    2. 配置yml

    server:
      port: 8086
    spring:
      data:
        mongodb:
          host: 192.168.239.130
          port: 27017
          database: test
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3. 使用方式选择

    这里说一下有个特殊点:
    在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的 _id字段作为主键。如果插入的文档省略了该_id字段,MongoDB 驱动程序会自动为该字段生成一个_id,还会新增一个_class字段,来存在全类名。如果有个字段为id,也会转化为_id

    在这里插入图片描述

    这里分为两种使用形式,一种是直接使用MongoTemplate,第二种就是extends MongoRepository,来实现各种API。

    这两种方式没有什么区别,不想写一个接口来继承的话,直接使用template也是没问题的!

    制定了MongoRepository就不需要每次操作的时候指定,像MongoTemplate就需要每次操作来指定是那个类。

    我们以第一种来使用,当然第二种的使用也给大家参考:

    public interface CommonLogRepository extends MongoRepository<CommonLog, String> {
    }
    
    • 1
    • 2

    4. CRUD操作

    简单的写在Controller里了

    新增如果数据库中不存在文档就会自动新增并把记录插入,还是很智能的!

    新增:

    private final MongoTemplate mongoTemplate;
    
    @PostMapping("saveCommonLog")
    public CommonLog saveCommonLog() {
        CommonLog commonLog = new CommonLog();
        commonLog.setOperIp("127.0.0.1");
        commonLog.setBusinessType(1);
        commonLog.setOperUrl("https://baidu.com");
        commonLog.setOperName("我是新增");
        commonLog.setTitle("测试第一条记录");
        commonLog.setRequestMethod("get");
        commonLog.setOperTime(new Date());
        return mongoTemplate.save(commonLog);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    查询所有:

    @GetMapping("getAllCommonLogs")
    public List<CommonLog> getAllCommonLogs() {
        return mongoTemplate.findAll(CommonLog.class);
    }
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    根据ID查询:

    @GetMapping("getCommonLogById")
    public CommonLog getCommonLogById(@RequestParam String id) {
        return mongoTemplate.findById(id, CommonLog.class);
    }
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    两种更新操作:

    @PostMapping("/updateCommonLog")
    public void updateCommonLog(){
    	// 第一种
        CommonLog commonLog = mongoTemplate.findById("65151ce0112fec57886da00c", CommonLog.class);
        if (commonLog != null) {
            commonLog.setOperName("我修改了你");
            mongoTemplate.save(commonLog);
        }
    	// 第二种
        Query query = Query.query(Criteria.where("id").is("65151d8f112fec57886da00d"));
        Update update = new Update().set("requestMethod", "update");
        mongoTemplate.updateFirst(query, update, CommonLog.class);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    根据id删除:

    @DeleteMapping("deleteCommonLogById")
    public void deleteCommonLogById(@RequestParam String id) {
        mongoTemplate.remove(Query.query(Criteria.where("id").is(id)), CommonLog.class);
    }
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    七、总结

    我们从非关系型数据库为切入点,引入了MongoDB,在进行介绍,着重介绍了特点,还有众多应用场景。

    从安装到连接,开始了整合Springboot实战,带大家进行CRUD实战操作。不知道大家有没有对MongoDB有了进一步的了解呢!

    赶快在项目中使用一下吧,有的时候不是需要这个技术来解决什么痛点,有时就是自己想拓展一下自己的技术栈,当然前提是在不影响系统的情况下哈!


    看到这里了,还请动一下您的发财小手,关注一下公众号哈!!谢谢您的关注!!文章首发看!!!

    建了一个IT交流群,欢迎大家加入,过期加我拉你们进哈!
    在这里插入图片描述

  • 相关阅读:
    《深度学习进阶 自然语言处理》第四章:Embedding层和负采样介绍
    隐式渲染 收集 SphereTracing
    6-redis配置文件(redis.conf)详解
    三、搭建 VLC,实战点播功能
    【无标题】
    利用编码特长,我赚取了每月1000美元的额外收入
    C#中await/async用法
    基于 React 的 HT for Web ,由厦门图扑团队开发和维护 - 用于 2D/3D 图形渲染和交互
    ES6的class
    MyBatisPlus简述
  • 原文地址:https://blog.csdn.net/qq_52423918/article/details/133376814