一. 什么是 MongoDB
MongoDB 是一个文档型数据库,数据以类似JSON 的文档形式存储
MongoDB 的设计理念是为了应对大数据量、高性能和灵活性需求
MongoDB 使用集合(Collections)来组织文档(Documents),每个文档都是由键值对组成的
含义 | |
---|---|
数据库(Database) | 存储数据的容器,类似于关系型数据库中的数据库 |
集合(Collection) | 数据库中的一个集合,类似于关系型数据库中的表 |
文档(Document) | 集合中的一个数据记录,类似于关系型数据库中的行(row),以 BSON 格式存储 |
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成,文档类似于JSON 对象,字段值可以包含其他文档,数组及文档数组:
1. 主要特点
特点 | 含义 |
---|---|
文档导向的存储 | :MongoDB 是一个面向文档的数据库,它以JSON-like 的格式存储数据,使得数据结构更加灵活和丰富 |
索引优化查询 | MongoDB 允许用户为文档中的任意属性创建索引,例如FirstName 和 Address,从而提高查询效率和排序性能 |
数据镜像与扩展性 | 通过本地或网络创建数据的副本,MongoD8 实现了强大的数据冗余和扩展能力 |
水平扩展与分片 | 面对增加的负载,MongoDB 可以通过分片技术将数据分布到计算机网络中的其他节点上,实现水平扩展 |
强大的查询语言 | MongoDB 使用JSON 格式的查询语法,支持复杂的查询表达式,包括对内嵌对象和数组的查询 |
数据更新 | 利用 update()命令,MongoDB 能够替换整个文档或更新指定的数据字段提供了灵活的数据更新方式 |
MapReduce 批量处理 | MongoDB的MapReduce 功能专为大规模数据处理和聚合操作设计,通过 Map 函数的 emit(key,value)调用和 Reduce 函数的逻辑处理,实现高效的数据汇总 |
MapReduce 脚本编写 | Map 和 Reduce 函数使用 JavaScript 编写,可以通过db.runCommand或mapreduce 命令在 MongoDB 中执行 |
GridFs 大文件存储 | GridFs是 MongoDB 内置的功能,用于存储和检索大于 BSON 文档大小限制的文件,如图片和视频 |
服务端脚本执行 | MongoDB 允许在服务端执行 JavaScript 脚本,提供了直接在服务端执行或存储函数定义以供后续调用的能力 |
多语言支持 | MongoDB 提供了对多种编程语言的支持,包括但不限于RUBY、PYTHON、JAVA、C++、PHP 和 C# |
2. Mongo DB 概念解析
SQL 术语/概述 | Mongo DB 术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据字段/域 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB 不支持 | |
primary key | primary key | 主键,MongoDB 自动将_id字段设置为主键 |
3. 完整术语列表
术语 | 解释 |
---|---|
文档(Document) | MongoDB 的基本数据单元,通常是一个JSON-like 的结构,可以包含多种数据类型 |
集合(Co1lection) | 类似于关系型数据库中的表,集合是一组文档的容器。在 MongoDB中,一个集合中的文档不需要有一个固定的模式 |
数据库(Database) | 包含一个或多个集合的MongoDB 实例 |
BSON | Binary JSON 的缩写,是MongoDB 用来存储和传输文档的二进制形式的 JSON |
索引(Index) | 用于优化查询性能的数据结构,可以基于集合中的一个或多个字段创建索引 |
分片(Sharding) | 一种分布数据到多个服务器(称为分片)的方法,用于处理大数据集和高吞吐量应用 |
副本集(Replica Set) | 一组维护相同数据集的 MongoDB 服务器,提供数据的冗余备份和高可用性 |
主节点(Primary) | 副本集中负责处理所有写入操作的服务器 |
从节点(Secondary) | 副本集中的服务器,用于读取数据和在主节点故障时接管为主节点 |
MongoDB Shell | MongoDB 提供的命令行界面,用于与 MongoDB 实例交瓦 |
聚合框架(Aggregation Framework) | 用于执行复杂的数据处理和聚合操作的一系列操作 |
objectId | MongoDB 为每个文档自动生成的唯一标识符 |
CRUD 操作 | 创建(Create)、读取(Read)、更新(Update)、删除(Delete)操作 |
事务(Transactions) | 从 MongoDB 4.0 开始支持,允许一组操作作为一个原子单元执行 |
操作符(0perators) | 用于查询和更新文档的特殊字段 |
连接(Join) | MongoDB 允许在査询中使用 $lookup 操作符来实现类似 SQL 的连接操作 |
TTL(Time-To-Live) | 可以为集合中的某些字段设置 TTL,以自动删除旧数据 |
存储引擎(Storage Engine) | MongoDB 用于数据存储和管理的底层技术,如 WiredTiger和 MongoDB 的旧存储引擎 MMAPv1 |
MongoDB Compass | MongoDB 的图形界面工具,用于可视化和管理 MongoDB 数据 |
MongoDB Atlas | MongoDB 提供的云服务,允许在云中托管 MongoDB 数据库 |
二. MongoDB 安装
##安装依赖包
[root@localhost ~]# dnf -y install libcurl openssl
##解压安装包
[root@localhost ~]# tar zxf mongodb-linux-x86_64-rhel8-8.0.8.tgz
##将解压包拷贝到指定目录
[root@localhost ~]# mv mongodb-linux-x86_64-rhel88-8.0.8 /usr/local/mongodb
##为 mongoDB 可执行文件bin做链接文件
[root@localhost ~]# ln -s /usr/local/mongodb/bin/* /usr/local/bin/
##创建数据存储目录
[root@localhost ~]# mkdir -p /var/lib/mongo
##创建日志文件目录
[root@localhost ~]# mkdir -p /var/log/mongodb
##安装依赖包openssl
[root@localhost ~]# dnf -y install gcc perl
##解压安装包
[root@localhost ~]# tar zxf openssl-1.1.1w.tar.gz
##切换解压包
[root@localhost ~]# cd openssl-1.1.1w
##配置
[root@localhost openssl-1.1.1w]# ./config --prefix=/opt/openssl11 --openssldir=/opt/openssl11/ssl
##编译内核2
[root@localhost openssl-1.1.1w]# make -j2
##安装
[root@localhost openssl-1.1.1w]# make install
##设置openssl的环境变量
[root@localhost ~]# vim /etc/profile
export LD_LIBRARY_PATH=/opt/openssl11/lib:$LD_LIBRARY_PATH
##执行脚本文件
[root@localhost ~]# source /etc/profile
##启动 Mongond 服务
[root@localhost ~]# mongod --dbpath /var/lib/mongodb --logpath /var/log/mongodb/mongod.log --fork
三. MongoDB Shell
MongoDB Shell 是 MongoDB 提供的官方交互式界面,允许用户与 MongoDB 数据库进行交互、执行命令和操作数据库
MongoDB Shell 是基于 JavaScript 的,允许用户直接在命令行或者脚本中使用 JavaScript 语言来操作 MongoDB 数据库
1. 安装 MongoDB Shell
##解压安装包
[root@localhost ~]# tar zxf mongosh-2.5.0-linux-x64-openssl3.tgz
##切换解压包
[root@localhost ~]# cd mongosh-2.5.0-linux-x64-openssl3
##切换bin目录
[root@localhost mongosh-2.5.0-linux-x64-openssl3]# cd bin/
##
[root@localhost bin]# cp mongosh /usr/local/bin/
[root@localhost bin]# cp mongosh_crypt_v1.so /usr/local/lib
2. 验证 MongoDB Shell
打开你的终端并使用 mongosh 命令连接到 MongoDB 服务器:
mongosh–host –port |
---|
说明:
命令 | 含义 |
---|---|
mongosh | 启动 MongoDB Shell 命令行工具 |
–host | 指定 MongoDB 服务器的主机名或 IP 地址 |
< hostname > | MongoDB 服务器的主机名(如 localhost)或 IP 地址(如 127.0.0.1) |
–port | 指定 MongoDB 服务器的端口号 |
< port > | MongoDB 服务器监听的端口号,默认端口是 27017 |
输入 mongosh 默认连接本地 mongodb 数据库,看到以下信息说明登录成功,warnings警告为优化提醒,可以暂时忽略,如若生产环境部署需要处理
[root@localhost ~]# mongosh |
---|
四. 数据库管理
1. 查看数据库列表
要查看当前 MongoDB 实例中所有数据库的列表,可以使用show dbs 命令:
> show dbs
要查看当前正在使用的数据库,可以使用db命令:
> db
2. 创建数据库
在MongoDB中,数据库的创建是一个简单的过程,当你首次向MongoDB 中插入数据时,如果数据库不存在,MongoDB 会自动创建它
我们只需选择一个数据库名称,并开始向其中插入文档即可
当你使用 use命令来指定一个数据库时,如果该数据库不存在,MongoDB 将自动创建它。MongoDB 创建数据库的语法格式如下:
Use DATABASE NAME |
---|
如果数据库不存在,则创建数据库,否则切换到指定数据库
实例
以下实例我们创建了数据库 mytest:
执行use mytest 命令后,MongoDp 将创建名为 mytest 的新数据库。此时,你可以开始在这个数据库中创建集合和插入文档
如果你想查看所有数据库,可以使用show dbs 命令:
可以看到,我们刚创建的数据库 mytest 并不在数据库的列表中,要显示它,我们需要向 mytest 数据库插入一些数据
3. 删除数据库
如果你需要删除数据库,可以使用 db.dropDatabase()方法:
示例
4. 默认数据库
MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,数据将存放在 test数据库中
当您通过 shell 连接到 MongoDB 实例时,如果未使用 use 命令切换到其他数据库,则会默认使用 test 数据库
例如,在启动 MongoDB 实例并连接到 MongoDB shell 后,如果您开始插入文档而未显式指定数据库,MongoDB 将默认使用 test 数据库
5. 系统内置数据库
在MongoDB 中,admin、config 和 local 是三个特殊的系统内置数据库
数据库:存储所有数据库的用户身份信息和全局权限(如root用户)。用admin户必须通过admin 数据库认证后才能执行跨库管理操作
config 数据库:仅在分片集群环境中存在。存储分片信息、块(chunk)分布、集合分片策略等关键元数据
local 数据库:存储当前节点的副本集状态、操作日志(oplog)等本地数据。数据不会被复制到其他节点,仅存在于当前实例
五. 集合管理
1. 查看集合
查看当前库已有集合,可以使用 showcollections 或 show tables 命令
> show collections
> show tables
2. 创建集合
MongoDB 中 createCollection() 使用方法来创建集合
语法格式:
db.createCollection (name, options) |
---|
参数说明:
参数 | 说明 |
---|---|
name | 要创建的集合名称 |
options | 可选参数,指定有关内存大小及索引的选项 |
options 可以是如下参数:
参数名 | 类型 | 描述 | 示例值 |
---|---|---|---|
capped | 布尔型 | 是否创建一个固定大小的集合 | true |
size | 数值 | 集合的最大大小(以字节为单位)。仅在 capped为true 时有效 | 10485760(10MB) |
max | 数值 | 集合中允许的最大文档数。仅在capped 为true时有效 | 5000 |
vaildator | 对象 | 用于文档验证的表达式 | { $jsonSchema:{…}} |
validationLevel | 字符串 | 指定文档验证的严格程度。“off”:不进行验证。strict":插入和更新操作都必须通过验证(默认)moderate”:仅现有文档更新时必须通过验证,插入新文档时不需要 | strict |
vaildationAction | 对象 | 为集合指定存储引擎配置 | { wiredTiger: { … }} |
collation | 对象 | 指定集合的默认排序规则 | {locale:enstrength:2} |
在插入文档时,MongoDB 首先检查固定集合的size字段,然后检查 max 字段
使用这些选项创建一个集合的实例:
这个例子创建了一个集合,具有以下特性:
固定大小,最大 10MB,最多存储 5000个文档
必须是有效文档必须包含 name和email字段,其中name必须是字符串,email的电子邮件格式
验证级别为严格,验证失败将阻止插入或更新
使用 WiredTiger 存储引擎,指定块压缩器为 zstd
默认使用英语排序规则
实例
在 test 数据库中创建 aaa 集合:
注意: 在 MongoDB 中,集合只有在内容插入后才会创建,就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建
3. 更新集合名
在 MongoDB 中,不能直接通过命令来重命名集合
MongoDB 可以使用 renameCollection!方法来来重命名集合
renameCollection 命令的语法:
db. adminCommand({
renameCollection:"sourceDb.sourceCollectionto:"targetDb.targetCollectiondropTarget:<boolean> })
参数说明:
参数 | 说明 |
---|---|
renameCollection | 要重命名的集合的完全限定名称(包括数据库名) |
to | 目标集合的完全限定名称(包括数据库名) |
dropTarget(可选) | 布尔值。如果目标集合已经存在,是否除目标集合。默认值为false |
示例
假设你要将 test 数据库中的 oldCollection 重命名为 newCollection,可以按以步骤进行:
**
①:确保已连接到 test 数据库**
> use test
②:运行 renameCollection 命令
db. adminCommand({
renameCollection:"test.oldCollection",to:"test.newCollection”});
如果你要将集合重命名到另一个数据库,例如将 test 数据库中的 oldCollection 重命名为 production 数据库中的 newCollection,可以这样做:
db. adminCommand({
renameCollection:"test.oldCollection"to:"production.newCollection"});
4. 删除集合
MongoDB 中使用 drop()方法来删除集合
drop()方法可以永久地从数据库中删除指定的集合及其所有文档,这是一个不可逆的操作因此需要谨慎使用
语法格式:
db.collection 名称.drop() |
---|
如果成功删除选定集合,则 drop()方法返回 true,否则返回 false
实例
六. 文档操作
1. 插入文档
文档的数据结构和 JSON 基本一样。所有存储在集合中的数据都是 BSON 格式。BSON是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称
常用的插入文档方法包括:
方法 | 用途 | 是否弃用 |
---|---|---|
insertMany() | 插入多个文档 | 否 |
insert() | 插入单个或多个文档 | 是 |
save() | 插入或更新文档 | 是 |
在 MongoDB 中,插入文档时如果集合(Collection)不存在,数据库会自动创建该集合。这是 MongoDB 的默认行为,也是其无模式设计(Schema-less)的核心特性之一
(1)insertOne()
insertOne()方法用于在集合中插入单个文档
db.collection 名称.insertOne(document, options) |
---|
参数 | 说明 |
---|---|
document | 要插入的单个文档 |
options(可选) | 一个可选参数对象,可以包含writeConcern 和 bypassDocumentValidation 等 |
示例
(2)insertMany()
insertMany()方法用于在集合中插入多个文档
db.collection.insertMany(documents, options) |
---|
参数 | 说明 |
---|---|
documents | 要插入的文档数组 |
options(可选) | 一个可选参数对象,可以包含 ordered、writeConcern 和 bypassDcumentValidation 等 |
2. 查询文档
MongoDB 查询文档使用find()、findOne()方法
(1)find()
MongoDB 查询数据的语法格式如下:
db.collection.find(query, projection) |
---|
参数 | 含义 |
---|---|
query | 用于查找文档的查询条件。默认为{ },即匹配所有文档 |
projection(可选) | 指定返回结果中包含或排除的字段 |
查找所有文档
按条件查找文档
说明:
$gt 是MongoDB 的比较操作符,表示"大于"(Greater Than)
这个条件的作用是筛选出 age 字段值大于 25 的文档
类似的其他比较操作符:
$lt(小于)、$gte(大于等于)、$lte(小于等于)$eq(等于)、$ne(不等于)
以易读的方式读取数据
(2)fineOne()
find0ne ()方法用于査找集合中的单个文档.如果找到多个匹配的文档.它只返回第一个
语法:
db.collection.findOne (query, projection) |
---|
参数 | 含义 |
---|---|
query | 用于查找文档的查询条件。默认为{ },即匹配所有文档 |
projection(可选) | 指定返回结果中包含或排除的字段 |
查找单个文档
3. 删除文档
常用的删除文档方法包括 delete0ne()、deleteMany()以及 find0neAndDelete()
(1)deleteOne()
delete0ne()方法用于删除匹配过滤器的单个文档
语法:
db.collection.deleteOne (filter, options) |
---|
参数 | 含义 |
---|---|
filter | 用于查找要删除的文档的查询条件 |
options(可选) | 一个可选参数对象 |
(2)deleteMany()
deleteMany()方法用于删除所有匹配过滤器的文档
语法::
db. collection.deleteMany(filter, options) |
---|
参数 | 含义 |
---|---|
filter | 用于查找要删除的文档的查询条件 |
options(可选) | 一个可选参数对象 |
(3)findOneAndDelete()
findOneAndDelete()方法用于查找并删除单个文档,并可以选择返回删除的文档
语法:
db.collection.findOneAndDelete(filter, options) |
---|
参数 | 含义 |
---|---|
filter | 用于查找要删除的文档的查询条件 |
options | 可选参数对象,如projection、sort等 |
find0neAndDelete 返回被删除的文档,如果找不到匹配的文档,则返回 null
4. 更新文档
在 MongoDB 中,更新文档的操作可以使用多种方法实现,常用的方法包括updateOne()、updateMany()、replace0ne()和findOneAndUpdate()
(1)updateOne()
update0ne()方法用于更新匹配过滤器的单个文档
语法:
db. collection.updateOne (filter,update.options) |
---|
参数 | 含义 |
---|---|
filter | 用于查找文档的查询条件 |
update | 指定更新操作的文档或更新操作符 |
options | 可选参数对象,如upsert、arrayFilters |
(2)updateMany()
updateMany()方法用于更新所有匹配过滤器的文档
语法:
db.collection.updateMany(filter, update, options) |
---|
参数 | 含义 |
---|---|
filter | 用于查找文档的查询条件 |
update | 指定更新操作的文档或更新操作符 |
options | 可选参数对象,如upsert、arrayFilters |
七. MongoDB备份与恢复
(1)安装备份与恢复命令
[root@localhost ~]# rpm -ivh mongodb-database-tools-rhel70-x86_64-100.12.0.rpm
(2) MongoDB 数据备份
语法格式
>mongodump -h dbhost-d dbname o dbdirectory
对数据备份
(3)MongoDB 数据恢复
mongodb 使用 mongorestore 命令来恢复备份的数据
mongorestore命令脚本语法如下:
>mongorestore -h<hostname><:port>-d dbname<path>
对数据删除,再恢复
恢复
恢复之后,zhangsan的数据已被恢复回来