使用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、创建用户
# 进入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表示用户认证成功
测试插入数据
db.user.insert({"name":"dzl","age":20}
测试查询
db.user.find()
测试navicat连接
整合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;
}