简介
MongoDB数据库是使用c++语言编写而成分布式文件存储开源数据库。也是市面上常见的非关系型数据库。
MongoDB的数据结构是键值对(key--value)MongoDB数据结构类似于JSON对象,因此它的数据结构被叫做BSON(Binary JSON),在使用MongoDB时需要区分大小写。
安装步骤
拉取镜像
docker pull mongo:7.0.0 ----后面跟的mongo镜像的版本号,不写就是拉取最新的镜像
启动容器
docker run --name mongoDB -d --restart=always -p 27017:27017 -v mongo_data:/data/db -v mongo_config:/data/configdb mongo
docker run
--name mongoDB # 为容器指定名称为 mongoDB
-d # 以分离模式(detached mode)运行容器
--restart=always # 确保容器在退出时总是重新启动
-p 27017:27017 # 将主机的 27017 端口映射到容器的 27017 端口
-v mongo_data:/data/db # 将主机上的 mongo_data 卷挂载到容器内的 /data/db 目录
-v mongo_config:/data/configdb # 将主机上的 mongo_config 卷挂载到容器内的 /data/configdb 目录
mongo # 使用官方的 MongoDB 镜像
mongDB与MySQL的映照关系
实际应用
适用场景:
- 大尺寸、低价值数据存储
- 数据缓存
- 社交网络平台
- 物流信息
- 电子商务系统
不适用场景:
- 需要使用复杂sql的系统,如:金融系统
- 需要高频使用事务的系统,如:银行系统
- 对性能要求不高的系统
常用命令
进入mongosh: docker exec -it mongoDB mongosh,出行附件所示的内容,表示已成功进入mongsh界面。
查看当前版本:db.version()
查看当前服务下的mongdb数据库:show dbs;
创建数据库:在 MongoDB Shell 中,使用 use <database_name> 命令创建一个新的数据库。如果数据库不存在,该命令会在第一次向数据库中插入数据时自动创建它。例如,输入 use myNewDatabase 即可创建一个名为 "myNewDatabase" 的新数据库。
使用指定的mongo数据库:use xx;出现附件所示的内容表示已成功指定数据库的使用。
删除数据库:先指定数据库,然后执行命令:db.dropDatabase("test1") 即可完成删除
查看当前库下的集合(对应mysql中的表):show collections;
创建集合:db.createCollection("dd")
删除集合:db.xx.drop("dd") 其中xx为数据库名称,dd为要删除的集合名称
插入单条数据:db.car_info.insert({"number":"川G123456","type":"小轿车","driver_id":"002"})
插入多条数据:db.car_info.insertMany([{"number":"川G123456","type":"小轿车","driver_id":"002"},{"number":"川G00000","type":"小轿车","driver_id":"003"}]) 需要注意的是,插入多条数据时,被插入内容是存放于一个数组中。
在插入数据时,如果对应的collection不存在,那么在执行插入命令时,会自动创建collection;如果插入的键在对应的collection中不存在,也会在collection中自动创建该键(字段)。
修改指定数据:
批量修改数据:db.car_info.updateMany({"type":"小轿车"},{$set:{"type":"小型乘用车"}})
删除数据:db.car_info.deleteOne({"number":"川G123456"})
批量删除数据:db.car_info.deleteMany({"number":"川G00000"})
查询数据:
使用主键查询: db.car_info.find({"_id": ObjectId("67885fd4cd769cb483e9496b")}) 因为主键是ObjectId类型,所以查询时需要使用ObjectId。
使用非ObjectId类型的字段查询:db.car_info.find({"type":"小轿车"})
只返回第一个查询结果:db.car_info.findOne({"type":"小轿车"})
查询结果限制返回数量:db.car_info.find({"type":"小轿车"}).limit(2)
聚合查询:聚合查询相当于mysql的连表查询,该查询过程分为三个阶段。$lookup 阶段、
u n w i n d 阶段、 unwind 阶段、 unwind阶段、project 阶段。
以下面命令为例:
```javascript
db.car_info.aggregate([{ ```
$lookup: { ``` $lookup:将另一个集合中的文档合并到当前文档中
from: "driver_info", ```想要链接的集合名称
localField: "driver_id", ```当前集合的关联外部集合的标识
foreignField: "code", ```外部集合的关联表示
as: "test_info" ```保存输出结果的文档(存放的是匹配到的另一集合的字段)
}
},
{
$unwind: "$test_info" ```$unwind: 将数组拆分成相互独立的文档
},
{
$project: { ```$project:选择和重命名输出文档中的字段
number: 1, ```原本集合中的字段可以通过赋值1进行保留
type: 1,
name: "$test_info.name" ```匹配到集合的字段需要从指定的文档中取用
}
}])
``
常见面试题
-
什么是 MongoDB?它与关系型数据库有何不同?
答:MongoDB是一款基于c++语言开发的分布式存储数据库,是一款非关系数据库。与关系数据库相比,MongoDB数据库没有表的概念,MongoDB中称之为数据集(collections);并且MongoDB数据库没有表结构,每一条数据以文档的形式存储。用户可以根据实际的场景添加字段,不在局限于传统的表结构限制。
-
解释 MongoDB 中的 BSON 数据格式
答:BSON数据格式类似于JSON格式,是一种二进制编码格式。支持各种数据类型,如字符串、整数、数组、对象等。而JSON只是一种纯文本的数据格式。
-
MongoDB 有哪些特点
答:
高性能:通过优化的存储引擎和索引机制,能够快速处理大量数据的读写操作。
高可用性:支持复制集和分片集群架构,确保数据的冗余备份和故障转移,提高系统的可靠性。
易扩展性:可以方便地添加节点到集群中,实现水平扩展,适应数据量的增长。
灵活的数据模型:文档型的存储方式使得数据结构可以根据应用需求灵活变化,无需预先定义严格的表结构。
-
解释一下 l o o k u p 操作符的作用和使用场景答: lookup 操作符的作用和使用场景 答: lookup操作符的作用和使用场景答:lookup 是 MongoDB 聚合管道中的一个阶段,用于执行左外连接操作。它可以将一个集合中的文档与另一个集合中的文档进行关联查询,并将关联的结果合并到输出文档中。例如,将订单集合与用户集合进行关联,获取每个订单对应的用户信息。
-
如何优化 MongoDB 的查询性能
答:
创建合适的索引:根据经常查询的字段创建索引,避免全表扫描。
优化查询语句:尽量减少不必要的字段查询和复杂的嵌套查询,合理使用查询操作符和聚合管道。
分析查询计划:使用 explain() 方法查看查询的执行计划,找出可能的性能瓶颈并进行优化。
使用缓存:对于频繁查询的数据,可以考虑使用 MongoDB 的内置缓存机制或将数据缓存到外部缓存系统如 Redis 中。
-
MongoDB 是如何保证数据一致性的
答:在复制集中,MongoDB 通过写入多数确认机制来保证数据的一致性。即当一个写操作提交时,必须得到大多数节点的确认才认为写操作成功。这样即使部分节点出现故障,只要有足够多的节点正常响应,就能保证数据的一致性和完整性。在分片集群中,还需要考虑分片键的选择和数据分布的均衡性等因素来保证数据的一致性。
-
什么是多文档事务,MongoDB 是如何支持的
答:多文档事务是指在同一个事务中对多个文档进行操作,要么全部成功,要么全部失败。MongoDB 从 4.0 版本开始支持多文档事务,通过两阶段提交协议来确保事务的原子性、一致性、隔离性和持久性。在使用多文档事务时,需要先开启一个会话(session),然后在会话中执行一系列的写操作,最后提交或中止事务。
学海无涯