MongoDB

百度百科:MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似jsonbson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

MongoDB是一种NoSQL数据库管理系统,它采用文档导向的数据模型,而不是传统的关系型数据库模型。

介绍
  1. 数据模型: MongoDB采用BSON(Binary JSON)文档存储数据,这些文档以键值对的形式组织在集合(Collection)中。文档可以包含嵌套的结构,使其更灵活。
  2. 灵活性: 由于MongoDB采用文档导向的数据模型,数据的结构可以非常灵活,可以轻松地适应不断变化的业务需求。
  3. 横向扩展性: MongoDB支持横向扩展,可以通过添加更多的节点来增加系统的处理能力,而无需修改应用程序代码。
  4. 丰富的查询语言: MongoDB提供强大的查询语言,支持丰富的查询操作,包括范围查询、正则表达式匹配、排序等。
  5. 索引支持: MongoDB支持各种类型的索引,可以提高查询性能。
  6. 自动分片: MongoDB可以自动分片数据,支持水平扩展,使其适用于处理大规模数据。
优点
  1. 灵活性和模式自由: 可以轻松地处理不同结构和类型的数据。
  2. 横向扩展: 可以通过添加更多的节点来实现横向扩展,提高性能和容量。
  3. 高性能: MongoDB使用内存映射存储引擎,可以提供高性能的读写操作。
  4. JSON风格的文档: 数据以JSON风格的BSON文档存储,易于理解和使用。
  5. 自动分片和负载均衡: MongoDB自动管理数据的分片和负载均衡,简化了扩展过程。
  6. 社区支持: MongoDB有一个活跃的社区,提供丰富的文档和资源,便于开发者学习和解决问题。
缺点
  1. 事务支持的限制: 在某些版本中,MongoDB的事务支持相对较弱,不如关系型数据库那么强大。
  2. 内存占用较大: MongoDB的内存占用相对较大,因为它使用内存映射文件来加速读写操作。
  3. 不适合复杂的事务处理: 对于需要复杂事务处理的应用,MongoDB可能不是最佳选择。
使用场景
  1. 大数据量、高并发读写: 由于MongoDB的横向扩展能力和高性能,适用于处理大规模数据和高并发读写的场景,如日志处理、物联网数据等。
  2. 需要灵活的数据模型: 对于数据结构经常变化、需要频繁调整的应用,MongoDB的灵活数据模型非常适合。
  3. 实时分析和查询: 适用于需要实时分析和查询大量非结构化数据的场景,例如实时报表生成、实时监控等。
  4. 文档存储需求: 对于需要存储和处理复杂文档结构的应用,MongoDB的文档导向模型非常方便。
  5. 敏捷开发: 在敏捷开发环境中,由于MongoDB的模式自由性,可以更快地迭代和调整数据模型。
体系机构

img

数据类型

MongoDB的最小存储单位就是文档document对象。文档document对象对应于关系型数据库的行。数据在MongoDB中以BSON(Binary-JSON)文档的格式存储在磁盘上。

BSON(Binary Serialized Document Format)是一种类json的一种二进制形式的存储格式,简称 Binary JSON;BSON和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和Bin Data类型。

BSON采用了类似于C语言结构体的名称、对表示方法,支持内嵌的文档对象和数组对象,具有轻量性、可遍历性、高效性的三个特点,可以有效描述非结构化数据和结构化数据。这种格式的优点是灵活性高,但它的缺点是空间利用率不是很理想。

BSON中,除了基本JSON类型: string,integer,boolean,double,null,array和object,mongo还使用了特殊的数据类型。这些类型包括 date, object id, binary data, regular expression和code。每一个驱动都以特定语言的方式实现了这些类型,查看你的驱动的文档来获取详细信息
img

1、安装

笔者本次采用ZIP压缩包的格式安装

传送门

image-20231226163738244

  1. 解压(将压缩包解压到全英文的文件夹下)

    解压后目录结构如下

    image-20231226164001599

  2. 创建文件夹(datalogs

    data为数据存储文件夹

    logs为日志存储文件夹

  3. 在bin目录创建配置文件(mongod.cfg),配置文件如下

    # mongod.conf
    
    # for documentation of all options, see:
    #   http://docs.mongodb.org/manual/reference/configuration-options/
    
    # Where and how to store data.
    storage:
      # 数据存储路径
      dbPath: D:\env\mongodb-win32-x86_64-windows-4.4.26\data
      journal:
        enabled: true
    #  engine:
    #  mmapv1:
    #  wiredTiger:
    
    # where to write logging data.
    systemLog:
      destination: file
      logAppend: true
      # 日志存储文件路径
      path:  D:\env\mongodb-win32-x86_64-windows-4.4.26\logs\mongod.log
    
    # network interfaces
    net:
      # 连接端口
      port: 27017
      # 允许外网连接
      bindIp: 0.0.0.0

    配置文件中的dbPathpath改成步骤二对应的路径

  4. 打开命令提示符定位到bin目录输入命令安装

    mongod --install --config ${步骤3创建的配置文件路径}

    示例:mongod --install --config D:envmongodb-win32-x86_64-windows-4.4.26binmongod.cfg

    启动MongoDB服务:net start mongodb

    image-20231226164733429

测试使用Navicat连接MongoDB数据库

image-20231226164919834

2、MongoDB常用命令

提示:可将bin目录配置到Windows环境变量中,以便在任何路径都能使用mongo命令
  1. 连接到数据库:

    mongo
  2. 显示数据库列表:

    show dbs
  3. 切换到指定数据库:

    use <database_name>
  4. 显示当前数据库:

    db
  5. 插入文档:

    db.<collection_name>.insert({ key: "value" })
  6. 查询所有文档:

    db.<collection_name>.find()
  7. 根据条件查询文档:

    db.<collection_name>.find({ key: "value" })
  8. 更新文档:

    db.<collection_name>.update({ key: "value" }, { $set: { new_key: "new_value" } })
  9. 删除文档:

    db.<collection_name>.remove({ key: "value" })
  10. 创建集合:

    db.createCollection("<collection_name>")
  11. 显示集合列表:

    show collections
  12. 删除集合:

    db.<collection_name>.drop()
  13. 创建索引:

    db.<collection_name>.createIndex({ key: 1 })
  14. 显示索引列表:

    db.<collection_name>.getIndexes()
  15. 删除索引:

    db.<collection_name>.dropIndex({ key: 1 })
  16. 显示服务器状态:

    db.serverStatus()
  17. 显示数据库状态:

    db.stats()
  18. 退出MongoDB客户端:

    exit

3、SpringBoot集成MongoDB

加入 spring-boot-starter-data-mongodb 依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

application.yml

spring:
  data:
    mongodb:
      host: localhost
      port: 27017
      database: test
package com.pqkj.mongodb.doc;

import lombok.Builder;
import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;

import java.util.List;

/**
 * @author THF
 * @date 2023/12/26 11:34
 */
@Data
@Builder
public class Student {
    /**
     * 姓名
     */
    private String name;

    /**
     * 年龄
     */
    private Integer age;

    /**
     * 性别
     */
    private String sex;

    /**
     * 爱好
     */
    private List<String> hobby;

    /**
     * 详细信息
     */
    private StudentDetail studentDetail;


}
package com.pqkj.mongodb.doc;

import lombok.Builder;
import lombok.Data;

/**
 * @author THF
 * @date 2023/12/26 11:39
 */
@Data
@Builder
public class StudentDetail {
    /**
     * 地址
     */
    private String address;

    /**
     * 电话
     */
    private String phone;
}
测试类
package com.pqkj.mongodb;

import com.pqkj.mongodb.doc.Student;
import com.pqkj.mongodb.doc.StudentDetail;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

import java.util.List;

/**
 * MongoTemplate 测试 CURD
 * @author THF
 * @date 2023/12/26 11:29
 */
@Slf4j
@SpringBootTest
public class MongoDBTest {

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 新增文档
     */
    @Test
    void insert() {
        List<Student> studentList = List.of(
                Student.builder()
                        .name("小唐")
                        .age(18)
                        .sex("男")
                        .hobby(List.of("羽毛球", "游戏", "Code")).build(),
                Student.builder()
                        .name("小陈")
                        .age(18)
                        .sex("女")
                        .hobby(List.of("Lion Mountain Code"))
                        .studentDetail(StudentDetail.builder()
                                .address("众创大厦")
                                .phone("110").build()).build()
        );
        for (Student student : studentList) {
            mongoTemplate.insert(student);
        }
    }

    /**
     * 查询所有
     */
    @Test
    void selectAll(){
        List<Student> studentList = mongoTemplate.findAll(Student.class);
        studentList.forEach((student -> log.info(student.toString())));
    }

    /**
     * 模糊查询
     */
    @Test
    void likeSelect(){
        String name="陈";
        String regex=String.format("%s%s%s","^.*",name,".*$");
        List<Student> studentList = mongoTemplate.find(Query.query(
                Criteria.where("name").regex(regex)
        ),Student.class);
        studentList.forEach((student -> log.info(student.toString())));
    }

    /**
     * 根据条件删除
     */
    @Test
    void remove(){
        mongoTemplate.remove(Query.query(
                Criteria.where("name").in(List.of("小陈"))
        ),Student.class);
    }
}
最后修改:2024 年 01 月 17 日
如果觉得我的文章对你有用,请随意赞赏