使用Docker安装MongoDB

MongoDB 和 MySQL 都是常用的数据库管理系统,但它们的设计目标不同,因此在某些方面的性能表现也有所不同。

MongoDB 是一个文档型数据库,它采用了面向文档的数据模型,支持动态查询和索引,适合存储非结构化和半结构化数据。它使用了基于BSON(Binary JSON)的数据格式,支持数据的自动分片和高可用性,可通过多台服务器横向扩展性能。

MySQL 是一个关系型数据库,它采用了传统的关系型数据模型,支持 SQL 语言和事务,适合存储结构化数据。它使用了基于表格的数据格式,支持多种存储引擎和索引类型,可以通过垂直和水平两种方式扩展性能。

在性能方面,MongoDB 在处理大量非结构化数据和高并发读写请求时具有优势。MongoDB 支持分片和副本集来实现高可用性和负载均衡,可以横向扩展,具有较好的读写性能。但在一些特定的查询场景下,MySQL 的性能可能更好,特别是涉及复杂的关联查询和聚合操作时。

总的来说,选择 MongoDB 还是 MySQL 应该基于具体的应用场景和数据特征。如果你的应用需要存储大量非结构化数据或需要高并发读写,那么 MongoDB 可能更适合;如果你需要进行复杂的关联查询或聚合操作,那么 MySQL 可能更适合。

安装MongoDB

1、拉取镜像

docker pull mongo

2、为了确保数据安全,需要创建一个目录保存MongoDB的数据

mkdir /root/sifan/mongo

3、启动MongoDB镜像

docker run -itd --name mongo -v /root/sifan/mongo:/data/db -p 27017:27017 mongo --auth

4、创建用户
mongodb5版本以上使用mongosh代替了mongo

docker exec -it mongo mongosh
# 进入MongoDB容器的admin数据库
docker exec -it mongo mongo admin
# 创建用户
db.createUser({ user:'root',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},'readWriteAnyDatabase']});

测试创建的用户
测试连接用户

db.auth('root', '123456')

输出1表示用户认证成功

docker开启MySQL 开启慢查询 docker mysql 性能_docker开启MySQL 开启慢查询

测试插入数据

db.user.insert({"name":"dzl","age":20}

测试查询

db.user.find()

测试navicat连接

docker开启MySQL 开启慢查询 docker mysql 性能_spring boot_02

整合SpringBoot

依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

创建超级管理员

# 切换到admin数据库
use admin
# 认证
db.auth('root', '123456')
# 创建超级管理员,用与SpringBoot连接
db.createUser({ user:'admin',pwd:'admin',roles:["root"]});

配置(连接MongoDB上的超级管理员)

spring:
  data:
    mongodb:
      host: xxx.xxx.xxx.xx
      port: 27017
      database: db_sifan_erp
      authentication-database: admin
      username: admin
      password: admin

测试

import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import javax.annotation.Resource;

/**
 * @Author : dengzhilin
 * @create 2023/2/28 11:20
 */
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class TestMongodb {
    @Resource
    private MongoTemplate mongoTemplate;

    /**
     * 保存
     */
    @Test
    public void save() {
        Student student = new Student();
        student.setId(100);
        student.setName("张三");
        student.setAge(18);
        // 保存
        mongoTemplate.save(student);
    }

    /**
     * 删除*
     */
    @Test
    public void delete() {
        // 创建查询
        Query query = new Query();
        Criteria criteria = new Criteria();
        // 设置条件:id为100
        criteria.and("id").is(100);
        //将条件添加到查询内
        query.addCriteria(criteria);
        // 调用remove(),进行删除
        DeleteResult res = mongoTemplate.remove(query, Student.class);
        System.out.println(res);
    }

    /**
     * 更新*
     */
    @Test
    public void update() {
        //创建查询
        Query query = new Query();
        Criteria criteria = new Criteria();
        // 设置查询条件,id为100
        criteria.and("id").is(100);
        query.addCriteria(criteria);
        //创建Update,修改字段 把age修改为200,name修改为李四
        Update update = new Update().set("age", 200).set("name", "李四");
        //执行修改操作,返回更新结果,包含更新的数据条数
        UpdateResult res = mongoTemplate.updateFirst(query, update, Student.class);

        System.out.println(res);
    }

    /**
     * 查询*
     */
    @Test
    public void select() {
        Query query = new Query();
        Criteria criteria = new Criteria();
        criteria.and("id").is(100);
        query.addCriteria(criteria);
        Student student = mongoTemplate.findOne(query, Student.class);
        System.out.println(student);
    }
}

@Data
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
@Document(value = "tb_student")
class Student {
    @Id
    private Integer id; //mongoDB推荐使用id,也可以自己指定一个字段作为主键
    @Field("student_name")
    private String name;
    @Field("age")
    private Integer age;
}