🏝️ 博主介绍
大家好,我是一个搬砖的农民工,很高兴认识大家 😊 ~
👨🎓 个人介绍 :本人是一名后端Java开发工程师,坐标北京 ~
🎉 感谢关注 📖 一起学习 📝 一起讨论 🌈 一起进步 ~
🙏 作者水平有限,欢迎各位大佬指正留言,相互学习进步 ~
目录
- [🏝️ 博主介绍](#🏝️ 博主介绍)
- [1. 概述 🚀](#1. 概述 🚀)
- [2. 数据模型与存储 🚀](#2. 数据模型与存储 🚀)
- [3. MongoDB 常用命令 🚀](#3. MongoDB 常用命令 🚀)
- [4. MongoDB 索引 🚀](#4. MongoDB 索引 🚀)
- [5. MongoDB的使用场景 🚀](#5. MongoDB的使用场景 🚀)
- [6. SpringBoot 集成 MongoDB 🚀](#6. SpringBoot 集成 MongoDB 🚀)
🌱 在数据库的世界里,MongoDB和MySQL是两种非常流行且功能强大的数据库系统,但它们各自的设计哲学、应用场景以及数据模型存在显著差异。对于数据库初学者来说,了解这些差异有助于更好地选择适合自己的工具,并深入理解数据库的基本原理。本文将带领你踏入MongoDB的世界,并通过与MySQL的对比,帮助你快速上手MongoDB。🍂
1. 概述 🚀
- ⭐ MongoDB :MongoDB是一个基于分布式文件存储的开源NoSQL数据库系统,由C++编写而成。与传统的关系型数据库不同,MongoDB采用了面向文档的存储方式,支持"无模式"的数据建模,能够存储比较复杂的数据类型。这使得MongoDB在处理半结构化和非结构化数据时,表现得尤为出色,如日志、社交媒体数据等。MongoDB属于NoSQL(Not Only SQL)数据库的一种。它采用键值存储的方式来存储数据,是一种类似于JSON 的 格式叫BSON(Binary JSON),虽然我们平时看到的文档都是JSON格式呈现,但在内部是以BSON格式存储的。MongoDB特别适合处理大规模数据集 、高并发读写 、以及需要灵活数据模型的应用场景。
- ⭐ MySQL:MySQL是一个流行的关系型数据库管理系统(RDBMS),使用标准的SQL语言来管理数据。它遵循ACID(原子性、一致性、隔离性、持久性)原则,适合需要事务处理、强一致性保证和复杂查询的应用场景。
2. 数据模型与存储 🚀
✨ MongoDB的数据模型:
- ⭐ 数据库(Database):包含多个集合,类似于关系型数据库中的数据库。
- ⭐ 集合(Collection):集合是文档的集合,相当于关系型数据库中的表,但不需要定义结构。
- ⭐ 文档(Document):MongoDB的基本单位是文档,文档是JSON格式的键值对集合,其内部格式为BSON。一个文档可以嵌套其他文档或数组,非常灵活。
✨ MySQL的数据模型:
- ⭐ 数据库(Database):数据库是表的容器,提供了命名空间、访问控制和数据完整性的机制
- ⭐ 表(Table):由行和列组成的二维数据结构,每列都有固定的数据类型和约束。
- ⭐ 行(Row):表中的一条记录。
- ⭐ 列(Column):表中的字段,定义了数据的类型和属性。
3. MongoDB 常用命令 🚀
- ⭐ 启动MongoDB :首先进入MongoDB目录下创建
data/db
文件夹,然后进入bin目录下面,执行mongod --dbpath=../data/db
- ⭐ 连接MongoDB :进入MongoDB的bin目录下执行
mongo --host=localhost --port=27017
- ⭐ 创建数据库 :
use 数据库
示例:use mydb。如果mydb不存在则创建它,存在则进入该数据库
- ⭐ 删除数据库 :
db.dropDatabase()
- ⭐ 查看当前数据库 :
db
- ⭐ 查看所有数据库 :
show dbs
- ⭐ 创建集合 :
db.createCollection("集合")
示例:db.createCollection("mycollection")
- ⭐ 删除集合 :
db.集合.drop()
示例:db.mycollection.drop()
- ⭐ 插入文档(单个) :
db.集合.insert(json数据)
示例:db.collection_08.insert({"name":"小张","age":18})
- ⭐ 插入文档(多个) :
db集合.insertMany([json数据])
||db集合.insert([json数据])
示例:db.collection_08.insertMany([{"name":"小张","age":18},{"name":"小张","age":18,"hight":"178cm"}])
- ⭐ 查询文档 :
db.集合.find()
(示例:db.collection_08.find()
) - ⭐ 查询指定字段 :
db.集合名.find({}, {"键名1": 1, "键名2": 0})
(1表示显示该字段,0表示不显示) - ⭐ 条件查询:
等于 :
db.集合名.find({"键名": "值"})
不等于 :
db.集合名.find({ "键名": { "$ne": "值" }})
AND条件 :
db.集合名.find({"键名1": "值1", "键名2": "值2"})
OR条件 :
db.集合名.find({"$or": [{"键名1": "值1"}, {"键名2": "值2"}]})
比较条件(大于、小于等) :
db.集合名.find({"键名": {"$gt": 值}})
,其中$gt
表示大于,$lt
表示小于,$gte
表示大于等于,$lte
表示小于等于IN条件 :
db.集合名.find({"键名": {"$in": ["值1", "值2"]}})
NOT IN条件 :
db.集合名.find({"键名": {"$nin": ["值1", "值2"]}})
模糊匹配(包含) :
db.集合名.find({"字段名": /值/})
正则表达式匹配(以某个值开头/结尾) :
db.集合名.find({"字段名": /^值/})
或db.集合名.find({"字段名": /值$/})
- ⭐ 删除所有文档 :
db.集合名.remove({})
- ⭐ 删除匹配条件的文档 :
db.集合名.remove({"键名": "值"})
- ⭐ 更新匹配到的第一条文档 :
db.集合名.updateOne({查询条件}, {$set: {更新内容}})
- ⭐ 更新匹配到的所有文档 :
db.集合名.updateMany({查询条件}, {$set: {更新内容}})
- ⭐ 统计 :
db.集合名.count()
||db.集合名.count({查询条件})
- ⭐ 排序 :
db.集合名.find().sort({"键名": 1})
(1为升序,-1为降序) - ⭐ 分页 :
db.集合名.find().skip(N).limit(M)
(跳过N条数据,限制返回M条数据)
4. MongoDB 索引 🚀
- ⭐ 创建单一索引 :
db.collection.createIndex({ fieldName: 1 })
collection 表示集合名称,fieldName 是你想要索引的字段名,1 表示升序索引(-1 表示降序索引)。
- ⭐ 创建复合索引 :
db.collection.createIndex({ fieldName1: 1, fieldName2: -1 })
复合索引可以基于多个字段的顺序来优化查询。
- ⭐ 查看索引 :
db.collection.getIndexes()
- ⭐ 删除索引 :
db.collection.dropIndex({ fieldName: 1 })
||db.collection.dropIndex(索引名称)
- ⭐ 删除所有索引(除了 _id 索引) :
db.collection.dropIndexes()
- ⭐ 索引评估 :
db.collection.find({ fieldName: "value" }).explain()
查询语句后面加 explain()
下面两张图片,第一张是没有使用到索引,第二张是使用到了索引。
5. MongoDB的使用场景 🚀
- 大数据存储和处理:MongoDB适用于存储和处理大量的非结构化数据,如日志数据、社交媒体数据、传感器数据等。由于其灵活的文档模型,MongoDB能够轻松地处理这些复杂且多变的数据结构。
- 实时分析和报表 :MongoDB的数据模型和查询语言(MongoDB Query Language,
MQL)支持复杂的聚合操作和数据分析,适合进行实时数据分析和报表生成。 - 高并发读写:MongoDB的异步非阻塞I/O模型和高性能的内存映射文件技术,使其能够应对高并发的读写请求,适用于需要处理大量用户访问和数据更新的应用场景。
- 内容管理系统(CMS):MongoDB可以用作内容管理系统的后端数据库,存储和管理大量的文章、图片、视频等内容。
- 社交网络应用:MongoDB的灵活数据模型和高性能读写能力使其成为社交网络应用的理想选择,能够存储用户信息、社交关系、消息等数据。
- 物联网(IoT)应用:MongoDB可以存储和处理大规模的物联网设备生成的数据,如传感器数据、设备状态等,为物联网应用提供强大的数据支持。
6. SpringBoot 集成 MongoDB 🚀
⚡ 源码地址: SpringBoot 集成 MongoDB
- 引入Maven依赖
typescript
<!--父依赖,dependency可以不加依赖版本-->
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.2.4.RELEASE</version>
</parent>
<dependencies>
<!-- mongodb -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!-- spring-boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
- 添加yaml配置文件
typescript
server:
port: 8082
spring:
data:
mongodb:
host: localhost
database: test_02
port: 27017
# 也可以直接使用uri连接
# uri: mongodb://localhost:27017/test_02
- 创建实体类
typescript
@Data
@Document(collection = "comment")
public class CommentEntity {
@Id
private String id;
// 点赞数
@Field("likeNum")
private Integer likeNum;
// 内容
private String comment;
// 父Id
private String parentId;
}
- 创建Dao
typescript
public interface CommentRepository extends MongoRepository<CommentEntity, String> {
/**
* 根据parentId获取数据
* @param parentId
* @return
*/
List<CommentEntity> findByParentId(String parentId);
}
- 创建Test进行测试
typescript
@RunWith(SpringRunner.class)
// 如果不放在swp.basis.service目录下,必须指定BasisApplication启动类
@SpringBootTest(classes = BasisApplication.class)
public class CommentServiceTest {
@Autowired
private CommentRepository commentRepository;
@Test
public void test(){
System.out.println(commentRepository.findAll());
System.out.println(commentRepository.findByParentId("66ed29b0bbf12138ee50b657"));
}
}