目录
一.什么是MongoDB
MongoDB是一个文档型数据库,数据以类似JSON的文档形式存储。
MongoDB的设计理念是为了应对大数据量、高性能和灵活性需求。
MongoDB使用集合(Collections)来组织文档(Documents),每个文档都是由键值对组成
的
- 数据库(Database):存储数据的容器,类似于关系型数据库中的数据库。
- 集合(Collection):数据库中的一个集合,类似于关系型数据库中的表。
- 文档(Document):集合中的一个数据记录,类似于关系型数据库中的行(row),
以BSON格式存储。
MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成,文档类似于
JSON对象,字段值可以包含其他文档,数组及文档数组:
1.主要特点
文档导向的存储:MongoDB是一个面向文档的数据库,它以JSON-like的格式存储数
据,使得数据结构更加灵活和丰富。
索引优化查询:MongoDB允许用户为文档中的任意属性创建索引,例如FirstName和A
ddress,从而提高查询效率和排序性能。
数据镜像与扩展性:通过本地或网络创建数据的副本,MongoDB实现了强大的数据冗余
和扩展能力。
水平扩展与分片:面对增加的负载,MongoDB可以通过分片技术将数据分布到计算机网
络中的其他节点上,实现水平扩展。
强大的查询语言:MongoDB使用JSON格式的查询语法,支持复杂的查询表达式,包括
对内嵌对象和数组的查询。
数据更新:利用updateO命令,MongoDB能够替换整个文档或更新指定的数据字段,提供了灵活的数据更新方式。
MapReduce批量处理:MongoDB的MapReduce功能专为大规模数据处理和聚合操作设
计,通过Map函数的emit(key,value)调用和Reduce函数的逻辑处理,实现高效的
数据汇总。
MapReduce脚本编写:Map和Reduce函数使用JavaScript编写,可以通过db.ru
nCommand 或 mapreduce命令在MongoDB中执行。
GridFS大文件存储:GridFS是MongoDB内置的功能,用于存储和检索大于BSON文
档大小限制的文件,如图片和视频。
服务端脚本执行:MongoDB允许在服务端执行JavaScript脚本,提供了直接在服务端
执行或存储函数定义以供后续调用的能力。
多语言支持:MongoDB提供了对多种编程语言的支持,包括但不限于RUBY、PYTHON、JAVA、C++、PHP 和 C#。
2.MongoDB 概念解析
不管我们学习什么数据库都应该学习其中的基础概念,在MongoDB中基本的概念是文
档、集合、数据库,下面我们挨个介绍。
下表将帮助您更容易理解MongoDB中的一些概念:
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 表格/集合 |
row | document | 数据记录的行/文档 |
colum | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
3.完整术语列表
文档(Document):MongoDB的基本数据单元,通常是一个JSON-like的结构,可以包含
多种数据类型。
集合(Collection):类似于关系型数据库中的表,集合是一组文档的容器。在MongoDB
中,一个集合中的文档不需要有一个固定的模式。
数据库(Database):包含一个或多个集合的MongoDB实例。
BSON:BinaryJSON的缩写,是MongoDB用来存储和传输文档的二进制形式的JSON。
索引(Index):用于优化查询性能的数据结构,可以基于集合中的一个或多个字段创建索
引。
分片(Sharding):一种分布数据到多个服务器(称为分片)的方法,用于处理大数据集和
高吞吐量应用。
副本集(ReplicaSet):一组维护相同数据集的MongoDB服务器,提供数据的冗余备份
和高可用性
主节点(Primary):副本集中负责处理所有写入操作的服务器。
从节点(Secondary):副本集中的服务器,用于读取数据和在主节点故障时接管为主节点。
MongoDBShell:MongoDB提供的命令行界面,用于与MongoDB实例交互。
聚合框架(AggregationFramework):用于执行复杂的数据处理和聚合操作的一系列操作。
Map-Reduce:一种编程模型,用于处理大量数据集的并行计算。
GridFS:用于存储和检索大于BSON文档大小限制的文件的规范。
ObjectId:MongoDB为每个文档自动生成的唯一标识符。
CRUD 操作:创建(Create)、读取(Read)、更新(Update)、删除(Delete》操作。
事务(Transactions):从MongoDB4.0开始支持,允许一组操作作为一个原子单元执行。
操作符(Operators):用于查询和更新文档的特殊字段。
连接(Join):MongoDB允许在查询中使用$1ookup操作符来实现类似SQL的连接操作。
TTL(Time-To-Live):可以为集合中的某些字段设置TTL,以自动删除旧数据。
存储引擎(StorageEngine):MongoDB用于数据存储和管理的底层技术,如WiredTiger
和MongoDB的旧存储引擎MMAPvl。
N
MongoDBCompass:MongoDB的图形界面工具,用于可视化和管理MongoDB数据。
1
MongoDBAtlas:MongoDB提供的云服务,允许在云中托管MongoDB数据库。
二.MongoDB安装
MongoDB的安装过程简单直观,便于用户快速部署和使用。MongoDB提供了linux各
个发行版本64位的安装包,你可以在官网下载安装包。
安装前我们需要安装各自的linux平台依赖包
解压主程序安装包
将应用程序移动到指定目录中
MongoDB的可执行文件在/bin目录中所以可以做链接文件或者添加到PATH中或者/etc/profile中
创建数据库目录
默认情况下MongoDB启动后会初始化以下两个目录:
数据存储目录:/var/lib/mongodb
日志文件目录:/var/log/mongodb
我们在启动前可以置当前用户有读写权限:
由于mongodb依赖openssl 11.1版本需要编译安装指定版本
设置openssl11环境变量
接下来启动mongodb服务
三.MongoDB Shell
MongoDBShell是MongoDB提供的官方交互式界面,允许用户与MongoDB数据库进行
交互、执行命令和操作数据库。
MongoDB Shell是基于JavaScript的,允许用户直接在命令行或者脚本中使用Java
Script语言来操作MongoDB数据库。
1.安装MongoDB Shell
解压安装包,将bin目录中mongosh二进制文件复制到PATH变量中列出的目录中,qqqqqq
例如/usr/local/bin:
2.验证mongodb shell
打开你的终端并使用mongosh命令连接到MongoDB服务器:
mongosh --host –port
说明:
mongosh:启动MongoDB Shell命令行工具。
—-host:指定MongoDB服务器的主机名或IP地址。
:MongoDB服务器的主机名(如1ocalhost)或IP地址(如127.0.0.1)。
—-port:指定MongoDB服务器的端口号。
:MongoDB服务器监听的端口号,默认端口是27017。
四.数据库管理
1.查看数据库列表
要查看当前MongoDB实例中所有数据库的列表,可以使用showdbs命令:
查看当前数据库是db命令
2.创建数据库
在MongoDB中,数据库的创建是一个简单的过程,当你首次向MongoDB中插入数据时,
如果数据库不存在,MongoDB会自动创建它。
一我们只需选择一个数据库名称,并开始向其中插入文档即可。
当你使用use命令来指定一个数据库时,如果该数据库不存在,MongoDB将自动创建它。
MongoDB创建数据库的语法格式如下:
如果数据库不存在,则创建数据库,否则切换到指定数据库。
可以看到,我们刚创建的数据库runoob并不在数据库的列表中,要显示它,我们需要
向runoob数据库插入一些数据。
3.删除数据库
如果你需要删除数据库,可以使用db.dropDatabase(方法:
上述命令将删除当前正在使用的myDatabase数据库及其所有集合。
4.默认数据库
MongoDB中默认的数据库为test,如果你没有创建新的数据库,数据将存放在test
数据库中。
当您通过shell连接到MongoDB实例时,如果未使用use命令切换到其他数据库,
则会默认使用test数据库。
例如,在启动MongoDB实例并连接到MongoDBshell后,如果您开始插入文档而未显
式指定数据库,MongoDB将默认使用test数据库。
5.系统内置数据库
在MongoDB中,admin、config和local是三个特殊的系统内置数据库
admin数据库:存储所有数据库的用户身份信息和全局权限(如一root用户)。用
户必须通过admin数据库认证后才能执行跨库管理操作。
config数据库:仅在分片集群环境中存在。存储分片信息、块(chunk)分布、集合
分片策略等关键元数据。
local数据库:存储当前节点的副本集状态、操作日志(oplog)等本地数据。数据不
会被复制到其他节点,仅存在于当前实例
五.集合管理
1.查看集合
查看当前库已有集合,可以使用showcollections或show tables命令
2.创建集合
MongoDB中使用createCollectionO方法来创建集合。
- name:要创建的集合名称。
- options:可选参数,指定有关内存大小及索引的选项。
以下是更清晰排版、优化表述的 Markdown 版本(保留原内容逻辑,仅优化格式与可读性 ):
参数名 | 类型 | 描述 | 示例值 |
---|---|---|---|
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中,集合只有在内容插入后才会创建,就是说,创建集合(数据表)后要
再插入一个文档(记录),集合才会真正创建。
3.更新集合名
在MongoDB中,不能直接通过命令来重命名集合。
MongoDB可以使用renameCollection方法来来重命名集合。
renameCollection 命令的语法:
db. adminCommand (
renameCollection: "sourceDb. sourceCollection”,
to:"targetDb. targetCollection”,
dropTarget:
})
renameCollection:要重命名的集合的完全限定名称(包括数据库名)。
·to:目标集合的完全限定名称(包括数据库名)。
dropTarget(可选):布尔值。如果目标集合已经存在,是否删除目标集合。默认值为f
alse。
如果你要将集合重命名到另一个数据库,例如将test数据库中的oldCollection重命名
为production数据库中的newCollection,可以这样做:
4.删除集合
MongoDB中使用dropO方法来删除集合。
dropO方法可以永久地从数据库中删除指定的集合及其所有文档,这是一个不可逆的操作,
因此需要谨慎使用。
语法格式:
db.collection名称.drop()
如果成功删除选定集合,则dropO方法返回true,否则返回false。
六.文档操作
文档的数据结构和JSON基本一样。所有存储在集合中的数据都是BSON格式。BSON
是一种类似JSON的二进制形式的存储格式,是BinaryJSON的简称。
1.插入文档
文档的数据结构和JSON基本一样。所有存储在集合中的数据都是BSON格式。BSON
是一种类似JSON的二进制形式的存储格式,是BinaryJSON的简称。
常用的插入文档方法
方法列表1
方法 | 用途 | 是否弃用 |
---|---|---|
insertOne() | 插入单个文档 | 否 |
方法列表2
方法 | 用途 | 是否弃用 |
---|---|---|
insertMany() | 插入多个文档 | 否 |
insert() | 插入单个或多个文档 | 是 |
save() | 插入或更新文档 | 是 |
在MongoDB中,插入文档时如果集合(Collection)不存在,数据库会自动创建该集
合。这是MongoDB的默认行为,也是其无模式设计(Schema-less)的核心特性之一
1.insertOne()
insertOne(方法用于在集合中插入单个文档。
db.collection 名称. insertOne(document, options)
- document:要插入的单个文档。
- options(可选》:一个可选参数对象,可以包含writeConcern和bypassDocumen
tValidation等。
2.insertMany()
insertMany0方法用于在集合中插入多个文档。
db. collection. insertMany(documents, options)
- documents:要插入的文档数组。
- options(可选):一个可选参数对象,可以包含ordered、writeConcern和 bypassDo
cumentValidation 等。
2.查询文档
MongoDB查询文档使用findO、findOneO方法
2.1 find()方法
fin()方法以非结构化的方式来显示所有文档。
按条件查找文档
说明:
(name: 1,age: 1, _id: 0}- 投影(Projection)
用于控制返回的字段(类似SQL中的SELECT语句):1表示包含该字段,0表
示排除该字段。1表示包含该字段,0表示排除该字段。例如_id:0表示排除默
认返回的_id字段。所以最终返回的文档仅包含name和age字段。
如果你需要以易读的方式来读取数据,可以使用pretty方法,语法格式如下:
db. myCollection. find O. pretty O
prettyO方法以格式化的方式来显示所有文档。
2.2findOne()方法
findOne0方法用于查找集合中的单个文档。如果找到多个匹配的文档,它只返回第一个。
3.删除文档
常用的删除文档方法包括deleteOne()、deleteMan()以及findOneAndDelete()。-
3.1 deleteOne()
deleteOne(方法用于删除匹配过滤器的单个文档。
3.2deleteMany()
3.3 findOneAndDelete()
4.更新文档
在MongoDB中,更新文档的操作可以使用多种方法实现,常用的方法包括updateOne()、updateMany()、replaceOne()和 findOneAndUpdat()。
4.1updateOne()
updateOne(方法用于更新匹配过滤器的单个文档。
4.2updateMany
updateManyO方法用于更新所有匹配过滤器的文档。
语法:
db.collection. updateMany(filter, update, options)
·filter:用于查找文档的查询条件。
· update:指定更新操作的文档或更新操作符。
·options:可选参数对象,如upsert、arrayFilters 等。
4.3replaceOne()
replaceOne0方法用于替换匹配过滤器的单个文档,新的文档将完全替换旧的文档。
语法:
db.collection. replaceOne(filter, replacement, options)
·filter:用于查找文档的查询条件。
·replacement:新的文档,将替换旧的文档。
· options:可选参数对象,如 upsert 等。
4.4 findOneAndUpdate()
findOneAndUpdateO方法用于查找并更新单个文档,可以选择返回更新前或更新后的文档。
语法:
db.collection. findOneAndUpdate(filter, update, options)
·filter:用于查找文档的查询条件。
·update:指定更新操作的文档或更新操作符。
· options:可选参数对象,如projection、sort、upsert、returnDocument
主等。
七.MongoDB备份(mongodump)与恢复(mongorestore)
1.安装备份与恢复命令
2.Mongodb数据备份
-h:MongoDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.
1:27017
-d:需要备份的数据库实例,例如:test
-o:备份的数据存放位置,例如:/data/dump,当然该目录需要提前建立,在备份完成
后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数
据。
删除数据库在恢复
恢复数据库