MongoDB
百度百科:MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
MongoDB是一种NoSQL数据库管理系统,它采用文档导向的数据模型,而不是传统的关系型数据库模型。
介绍
- 数据模型: MongoDB采用BSON(Binary JSON)文档存储数据,这些文档以键值对的形式组织在集合(Collection)中。文档可以包含嵌套的结构,使其更灵活。
- 灵活性: 由于MongoDB采用文档导向的数据模型,数据的结构可以非常灵活,可以轻松地适应不断变化的业务需求。
- 横向扩展性: MongoDB支持横向扩展,可以通过添加更多的节点来增加系统的处理能力,而无需修改应用程序代码。
- 丰富的查询语言: MongoDB提供强大的查询语言,支持丰富的查询操作,包括范围查询、正则表达式匹配、排序等。
- 索引支持: MongoDB支持各种类型的索引,可以提高查询性能。
- 自动分片: MongoDB可以自动分片数据,支持水平扩展,使其适用于处理大规模数据。
优点
- 灵活性和模式自由: 可以轻松地处理不同结构和类型的数据。
- 横向扩展: 可以通过添加更多的节点来实现横向扩展,提高性能和容量。
- 高性能: MongoDB使用内存映射存储引擎,可以提供高性能的读写操作。
- JSON风格的文档: 数据以JSON风格的BSON文档存储,易于理解和使用。
- 自动分片和负载均衡: MongoDB自动管理数据的分片和负载均衡,简化了扩展过程。
- 社区支持: MongoDB有一个活跃的社区,提供丰富的文档和资源,便于开发者学习和解决问题。
缺点
- 事务支持的限制: 在某些版本中,MongoDB的事务支持相对较弱,不如关系型数据库那么强大。
- 内存占用较大: MongoDB的内存占用相对较大,因为它使用内存映射文件来加速读写操作。
- 不适合复杂的事务处理: 对于需要复杂事务处理的应用,MongoDB可能不是最佳选择。
使用场景
- 大数据量、高并发读写: 由于MongoDB的横向扩展能力和高性能,适用于处理大规模数据和高并发读写的场景,如日志处理、物联网数据等。
- 需要灵活的数据模型: 对于数据结构经常变化、需要频繁调整的应用,MongoDB的灵活数据模型非常适合。
- 实时分析和查询: 适用于需要实时分析和查询大量非结构化数据的场景,例如实时报表生成、实时监控等。
- 文档存储需求: 对于需要存储和处理复杂文档结构的应用,MongoDB的文档导向模型非常方便。
- 敏捷开发: 在敏捷开发环境中,由于MongoDB的模式自由性,可以更快地迭代和调整数据模型。
体系机构
数据类型
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。每一个驱动都以特定语言的方式实现了这些类型,查看你的驱动的文档来获取详细信息
1、安装
笔者本次采用ZIP压缩包的格式安装
- 解压(将压缩包解压到全英文的文件夹下)
解压后目录结构如下
- 创建文件夹(
data
、logs
)data为数据存储文件夹
logs为日志存储文件夹
在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
配置文件中的
dbPath
、path
改成步骤二对应的路径- 打开命令提示符定位到bin目录输入命令安装
mongod --install --config ${步骤3创建的配置文件路径}
示例:mongod --install --config D:envmongodb-win32-x86_64-windows-4.4.26binmongod.cfg
启动MongoDB服务:
net start mongodb
测试使用Navicat连接MongoDB数据库
2、MongoDB常用命令
提示:可将bin目录配置到Windows环境变量中,以便在任何路径都能使用mongo命令
连接到数据库:
mongo
显示数据库列表:
show dbs
切换到指定数据库:
use <database_name>
显示当前数据库:
db
插入文档:
db.<collection_name>.insert({ key: "value" })
查询所有文档:
db.<collection_name>.find()
根据条件查询文档:
db.<collection_name>.find({ key: "value" })
更新文档:
db.<collection_name>.update({ key: "value" }, { $set: { new_key: "new_value" } })
删除文档:
db.<collection_name>.remove({ key: "value" })
创建集合:
db.createCollection("<collection_name>")
显示集合列表:
show collections
删除集合:
db.<collection_name>.drop()
创建索引:
db.<collection_name>.createIndex({ key: 1 })
显示索引列表:
db.<collection_name>.getIndexes()
删除索引:
db.<collection_name>.dropIndex({ key: 1 })
显示服务器状态:
db.serverStatus()
显示数据库状态:
db.stats()
退出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);
}
}