这里写目录标题
什么是 MongoDB
MongoDB是一个文档型数据库,数据以类似JSON的文档形式存储
MongoDB 的设计理念是为了应对大数据量、高性能和灵活性需求
MongoDB使用集合(Collections)来组织文档(Documents),每个文档都是由键值对组成的
- 数据库(Database):存储数据的容器,类似于关系型数据库中的数据库
- 集合(Collection):数据库中的一个集合,类似于关系型数据库中的表
- 文档(Document):集合中的一个数据记录,类似于关系型数据库中的行(row),以BSON 格式存储
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成,文档类似于JSON 对象,字段值可以包含其他文档,数组及文档数组:
主要特点
文档导向的存储:MongoDB 是一个面向文档的数据库,它以JSON-like 的格式存储数据,使得数据结构更加灵活和丰富。
索引优化查询:MongoDB 允许用户为文档中的任意属性创建索引,例如FirstName 和Address,从而提高查询效率和排序性能。
数据镜像与扩展性:通过本地或网络创建数据的副本,MongoDB 实现了强大的数据冗余和扩展能力。
水平扩展与分片:面对增加的负载,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#
MongoDB概念解析
不管我们学习什么数据库都应该学习其中的基础概念,在 MongoDB 中基本的概念是文档、集合、数据库,下面我们挨个介绍。
下表将帮助您更容易理解MongoDB中的一些概念:
SQL 术语/概念 | MongoDB 术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 不支持 | 表连接在 MongoDB 中不支持 |
primary key | primary key | 主键,MongoDB 自动将 _id 字段设置为主键 |
完整术语列表
文档(Document):MongoDB的基本数据单元,通常是一个JSON-like 的结构,可以包含多种数据类型。
集合(Co1lection):类似于关系型数据库中的表,集合是一组文档的容器。在 MongoDB中,一个集合中的文档不需要有一个固定的模式。
数据库(Database):包含一个或多个集合的MongoDB 实例。
BSON:BinaryJSON的缩写,是MongoDB用来存储和传输文档的二进制形式的JSON。
索引(Index):用于优化查询性能的数据结构,可以基于集合中的一个或多个字段创建索
引。
分片(Sharding):一种分布数据到多个服务器(称为分片)的方法,用于处理大数据集和高吞吐量应用。
副本集(Replica Set):一组维护相同数据集的 MongoDB 服务器,提供数据的冗余备份和高可用性。
主节点(Primary):副本集中负责处理所有写入操作的服务器。
从节点(Secondary):副本集中的服务器,用于读取数据和在主节点故障时接管为主节点。
MongoDB Shell:MongoDB 提供的命令行界面,用于与 MongoDB 实例交互。
聚合框架(Aggregation Framework):用于执行复杂的数据处理和聚合操作的一系列操作。
Map-Reduce:一种编程模型,用于处理大量数据集的并行计算。
GridFs:用于存储和检索大于 BSON 文档大小限制的文件的规范
0bjectId:MongoDB 为每个文档自动生成的唯一标识符。
CRUD 操作:创建(Create)、读取(Read)、更新(Update)、删除(Delete)操作。
事务(Transactions):从 MongoDB 4.0 开始支持,允许一组操作作为一个原子单元执行。
操作符(0perators):用于查询和更新文档的特殊字段。
连接(Join):MongoDB 允许在查询中使用 $lookup 操作符来实现类似 SQL 的连接操作。
TTL(Time-To-Live):可以为集合中的某些字段设置 TTL,以自动删除旧数据。
存储引擎(Storage ngine):MongoDB 用于数据存储和管理的底层技术,如WiredTiger和 MongoDB的旧存储引擎 MMAPv1。
MongoDB Compass:MongoDB 的图形界面工具,用于可视化和管理 MongoDB 数据
MongoDB Atlas:MongoDB 提供的云服务,允许在云中托管 MongoDB 数据库
MongoDB
MongoDB 的安装过程简单直观,便于用户快速部署和使用。MongoDB 提供了 linux名个发行版本64位的安装包,你可以在官网下载安装包
安装前我们需要安装各个Linux平台依赖包:
[root@bogon ~]# dnf -y install libcurl openssl
OS 6.9 kB/s | 1.9 kB 00:00
everything 5.1 kB/s | 2.0 kB 00:00
EPOL 5.6 kB/s | 2.3 kB 00:00
解压安装包
[root@bogon ~]# tar zxvf mongodb-linux-x86_64-rhel8-8.0.8.tgz
将解压包拷贝到指定目录
[root@bogon ~]# mv mongodb-linux-x86_64-rhel88-8.0.8/ /usr/local/mongodb
MongoDB的可执行文件位于bin目录下,所以可以将其添加到PATH路径中:
[root@bogon ~]# echo 'export PATH=/usr/local/mongodb/bin:$PATH' >> /etc/profile source /etc/profile
创建数据库目录
默认情况下 MongoDB 启动后会初始化以下两个目录:
数据存储目录:/var/lib/mongodb
日志文件目录:/var/log/mongodb
我们在启动前可以先创建这两个目录并设置当前用户有读写权限:
[root@bogon ~]# mkdir -p /var/lib/mongo
[root@bogon ~]# mkdir -p /var/log/mongodb
[root@bogon ~]# chown 'root' /var/lib/mongo
[root@bogon ~]# chown 'root' /var/log/mongodb/
由于 mongodb 依赖openssl11,需要编译安装 openss111
[root@bogon ~]# dnf -y install gcc make perl
[root@bogon ~]# tar zxvf openssl-1.1.1w.tar.gz
[root@bogon ~]# cd openssl-1.1.1w
[root@bogon openssl-1.1.1w]# ./config --prefix=/opt/openss111 --openssldir=/opt/opens111/ssl
Operating system: x86_64-whatever-linux2
Configuring OpenSSL version 1.1.1w (0x1010117fL) for linux-x86_64
Using os-specific seed configuration
Creating configdata.pm
Creating Makefile
**********************************************************************
*** ***
*** OpenSSL has been successfully configured ***
*** ***
*** If you encounter a problem while building, please open an ***
*** issue on GitHub <https://github.com/openssl/openssl/issues> ***
*** and include the output from the following command: ***
*** ***
*** perl configdata.pm --dump ***
*** ***
*** (If you are new to OpenSSL, you might want to consult the ***
*** 'Troubleshooting' section in the INSTALL file first) ***
*** ***
**********************************************************************
[root@bogon openssl-1.1.1w]# make -j$(nproc)
[root@bogon openssl-1.1.1w]# make install
设置openssl11的环境变量
[root@bogon ~]# echo 'exprot LD_LIBRARY_PATH=/opt/openss111/lib:$LD_LIBRARY_PATH' | sudo tee /etc/profile.d/openss111.sh
[root@bogon ~]# source /etc/profile.d/openss111.sh
接下来启动 Mongodb 服务:
[root@bogon ~]# mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
看到以下信息,说明启动成功
[root@localhost~]# mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log--fork
about to fork child process, waiting until server is ready for connections.
forked process:12102
child process started successfully, parent exiting
MongoDB Shell
MongoDB Shell 是 MongoDB 提供的官方交互式界面,允许用户与 MongoDB 数据库进行交互、执行命令和操作数据库
MongoDB Shell 是基于 JavaScript 的,允许用户直接在命令行或者脚本中使用 JavaScript 语言来操作 MongoDB 数据库
安装 MongoDB Shell
解压安装包,将 bin 目录中mongosh 二进制文件复制到 PATH 变量中列出的目录中例如 /usr/local/bin:
[root@bogon ~]# tar zxvf mongosh-2.5.0-linux-x64-openssl3.tgz
[root@bogon ~]# cd mongosh-2.5.0-linux-x64-openssl3
[root@bogon mongosh-2.5.0-linux-x64-openssl3]# cd bin/
[root@bogon bin]# cp mongosh /usr/local/bin/
[root@bogon bin]# cp mongosh_crypt_v1.so /usr/local/lib/
验证MongoDB Shell
[root@bogon ~]# mongosh
Current Mongosh Log ID: 68075fb2dcab8d99631b26ff
Connecting to: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.5.0
MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017
数据库管理
查看数据库列表
要查看当前 MongoDB 实例中所有数据库的列表,可以使用show dbs 命令:
show dbs
要查看当前正在使用的数据库,可以使用db命令:
db
创建数据库
在 MongoDB 中,数据库的创建是一个简单的过程,当你首次向 MongoDB 中插入数据时如果数据库不存在,MongoDB会自动创建它。
我们只需选择一个数据库名称,并开始向其中插入文档即可。
当你使用 use命令来指定一个数据库时,如果该数据库不存在,MongoDB 将自动创建它。MongoDB 创建数据库的语法格式如下:
use DATABASE_NAME
执行use runoob 命令后,MongoDB 将创建名为 runoob 的新数据库。此时,你可以开始在这个数据库中创建集合和插入文档。
如果你想查看所有数据库,可以使用showdbs命令:
可以看到,我们刚创建的数据库runoob 并不在数据库的列表中,要显示它,我们需要向 runoob 数据库插入一些数据
删除数据库
默认数据库
MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,数据将存放在 test数据库中。
当您通过 she1l 连接到 MongoDB 实例时,如果未使用 use 命令切换到其他数据库,则会默认使用 test 数据库。
例如,在启动 MongoDB 实例并连接到 MongoDB shell 后,如果您开始插入文档而未显式指定数据库,MongoDB 将默认使用 test 数据库
系统内置数据库
在 MongoDB 中,admin、config 和 local 是三个特殊系统内置数据库:
- admin 存储所有数据库的用户身份信息和全局权限(如 root 用户 ),用户需经其认证方可执行跨库管理操作
- config 仅在分片集群环境存在,存储分片信息、块(chunk)分布、集合分片策略等关键元数据
- local 存储当前节点的副本集状态、操作日志(oplog)等本地数据,数据不会复制到其他节点,仅存在于当前实例
集合管理
查看集合
查看当前库已有集合,可以使用showcollections或showtables命令
创建集合
capped 布尔值 是否创建一个固定大小的集合。 true
size 数值 集合的最大大小(以字节为单位)。仅在 capped 为 true 时有效。 10485760(10MB)
max 数值 集合中允许的最大文档数。仅在 capped 为 true 时有效。 5000
validator 对象 用于文档验证的表达式。 { $jsonSchema: { … }}
validationLevel 字符串 指定文档验证的严格程度。
“off”:不进行验证。
“strict”:插入和更新操作都必须通过验证(默认)。
“moderate”:仅现有文档更新时必须通过验证,插入新文档时不需要。 “strict”
validationAction 字符串 指定文档验证失败时的操作。
“error”:阻止插入或更新(默认)。
“warn”:允许插入或更新,但会发出警告。 “error”
storageEngine 对象 为集合指定存储引擎配置。 { wiredTiger: { … }}
collation 对象 指定集合的默认排序规则。 { locale: “en”, strength: 2 }
更新集合名
在 MongoDB中,不能直接通过命令来重命名集合,MongoDB 可以使用 renameCollection 方法来来重命名集合。
renameCollection 命令的语法:
db.adminCommand({
renameCollection: "sourceDb.sourceCollection",
to: "targetDb.targetCollection",
dropTarget: <boolean>
})
参数说明
- renameCollection 要重命名的集合的完全限定名称(包括数据库名)
- to 目标集合的完全限定名称(包括数据库名)
- dropTarget(可选) 布尔值。如果目标集合已经存在,是否删除目标集合。默认值为 false
删除集合
MongoDB 中使用 drop () 方法来删除集合。
drop () 方法可以永久地从数据库中删除指定的集合及其所有文档,这是一个不可逆的操作,因此需要谨慎使用。
语法格式:
db.collection 名称.drop ()
如果成功删除选定集合,则 drop () 方法返回 true,否则返回 false。
文档操作
插入文档
文档的数据结构和JSON 基本一样。所有存储在集合中的数据都是BSON格式。BSON是一种类似 JSON 的二进制形式的存储格式,是BinaryJSON 的简称
方法 用途 是否弃用
insertOne() 插入单个文档 否
insertMany() 插入多个文档 否
insert() 插入单个或多个文档 是
save() 插入或更新文档
insertOne()
insert0ne()方法用于在集合中插入单个文档。
db. collection 名称.insertOne(document, options)
document:要插入的单个文档。
·options(可选):一个可选参数对象,可以包含writeConcern 和 bypassDocumentValidation 等
insertMany()
insertMany()方法用于在集合中插入多个文档。
db.collection.insertMany(documents, options)
documents:要插入的文档数组。
options(可选):一个可选参数对象,可以包含 ordered、writeConcern 和 bypassDocumentValidation等
查询文档
MongoDB 查询文档使用find()、findOne()方法
find()方法
find()方法以非结构化的方式来显示所有文档。
MongoDB查询数据的语法格式如下:
db.collection.find(query, projection)
- query:用于查找文档的查询条件。默认为},即匹配所有文档。
- pro.jection(可选):指定返回结果中包含或排除的字段
find0ne()方法
find0ne()方法用于查找集合中的单个文档。如果找到多个匹配的文档,它只返回第一个。
语法:
db.collection.findOne (query, projection)
-
query:用于查找文档的查询条件。默认为},即匹配所有文档。
-
projection(可选):指定返回结果中包含或排除的字段
删除文档
常用的删除文档方法包括 delete0ne()、deleteMany()以及 find0neAndDelete()
deleteOne()
delete0ne()方法用于删除匹配过滤器的单个文档。语法:
db.collection.delete0ne (filter, options)
·filter:用于查找要删除的文档的查询条件。
·options(可选):一个可选参数对象
deleteMany()
deleteMany()方法用于删除所有匹配过滤器的文档。
语法:
db. collection, deleteMany(filter, options)
filter:用于查找要删除的文档的查询条件。·options(可选):一个可选参数对象
findOneAndDelete()
findOneAndDelete()方法用于查找并删除单个文档,并可以选择返回删除的文档。语法:
db. collection.findOneAndDelete(filter, options)
·filter:用于查找要删除的文档的查询条件。
·options:可选参数对象,如projection、sort
更新文档
在 MongoDB 中,更新文档的操作可以使用多种方法实现,常用的方法包括updateOne()、updateMany()、replace0ne()和findOneAndUpdate()
update0ne ()
update0ne()方法用于更新匹配过滤器的单个文档。
语法:
db.collection.update0ne(filter, update, options)
·filter:用于查找文档的查询条件。
·update:指定更新操作的文档或更新操作符
options:可选参数对象,如upsert、arrayFilters等
updateMany()
updateMany()方法用于更新所有匹配过滤器的文档。
语法:
db.collection.updateMany(filter, update, options)
·filter:用于查找文档的查询条件。
·update:指定更新操作的文档或更新操作符。*options:可选参数对象,如upsert、arrayFilters等
replaceOne()
replaceOne ()方法用于替换匹配过滤器的单个文档,新的文档将完全替换旧的文档。
语法:
db.collection.replace0ne(filter, replacement, options)
·filter:用于查找文档的查询条件。
·replacement:新的文档,将替换旧的文档。
·options:可选参数对象,如upsert等
findOneAndUpdate()
find0neAndUpdate()方法用于查找并更新单个文档,可以选择返回更新前或更新后的文档。
语法:
db. collection. findOneAndUpdate(filter, update, options)
·filter:用于查找文档的查询条件。
·update:指定更新操作的文档或更新操作符。*options:可选参数对象,如projection、sort、upsert、returnDocument