MongoDB数据库应用
目录
一:什么是MongoDB
1:主要特点
2:MongoDB概念解析
3:完整术语列表
二:MongoDB安装
三:MongoDB Shell
1:安装MongoDB Shell
2:验证MongoDB Shell
四:数据库管理
1:查看数据库列表
2:创建数据库
3:删除数据库
4:默认数据库
5:系统内置数据库
五:集合管理
1:查看集合
2:创建集合
3:更新集合名
4:删除集合
六:文档操作
1:插入文档
2:查询文档
3:删除文档
4:更新文档
七:MongoDB备份与恢复
1:安装备份与恢复命令
2:MongoDB数据备份和恢复
八:MongoDB用户管理
1:编写配置文件
2:先启用非认证模式
3:登录数据库
4:只能在非认证的情况下删除用户
一:什么是MongoDB
MongoDB 是一个文档型数据库,数据以类似 JSON 的文档形式存储。
MongoDB 的设计理念是为了应对大数据量、高性能和灵活性需求。
MongoDB 使用集合(Collections)来组织文档(Documents),每个文档都是由键值对组成的。
- 数据库(Database):存储数据的容器,类似于关系型数据库中的数据库。
- 集合(Collection):数据库中的一个集合,类似于关系型数据库中的表。
- 文档(Document):集合中的一个数据记录,类似于关系型数据库中的行(row),以 BSON 格式存储。
MongoDB 将数据存储为一个文档,数据结构由键值 (key=>value) 对组成,文档类似于 JSON 对象,字段值可以包含其他文档、数组及文档数组:
1:主要特点
- 文档导向的存储: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#。
2:MongoDB概念解析
下表将帮助您更容易理解 MongoDB 中的一些概念:
SQL 术语 / 概念 | MongoDB 术语 / 概念 | 解释 / 说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表 / 集合 |
row | document | 数据记录行 / 文档 |
column | field | 数据字段 / 域 |
index | index | 索引 |
table joins | 表连接,MongoDB 不支持 | |
primary key | primary key | 主键,MongoDB 自动将 id 字段设置为主键 |
3:完整术语列表
- 文档(Document):MongoDB 的基本数据单元,通常是一个 JSON - like 的结构,可以包含多种数据类型。
- 集合(Collection):类似于关系型数据库中的表,集合是一组文档的容器。在 MongoDB 中,一个集合中的文档不需要有一个固定的模式。
- 数据库(Database):包含一个或多个集合的 MongoDB 实例。
- BSON:Binary JSON 的缩写,是 MongoDB 用来存储和传输文档的二进制形式的 JSON。
- 索引(Index):用于优化查询性能的数据结构,可以基于集合中的一个或多个字段创建索引。
- 分片(Sharding):一种分布数据到多个服务器(称为分片)的方法,用于处理大数据集和高吞吐量应用。
- 副本集(Replica Set):一组维护相同数据集的 MongoDB 服务器,提供数据的冗余备份和高可用性。
- 主节点(Primary):副本集中负责处理所有写入操作的服务器。
- 从节点(Secondary):副本集中的服务器,用于读取数据和在主节点故障时接管为主节点。
- MongoDB Shell:MongoDB 提供的命令行界面,用于与 MongoDB 实例交互。
- 聚合框架(Aggregation Framework):用于执行复杂的数据处理和聚合操作的一系列操作。
- Map - Reduce:一种编程模型,用于处理大量数据集的并行计算。
- GridFS:用于存储和检索大于 BSON 文档大小限制的文件的规范。
- ObjectId:MongoDB 为每个文档自动生成的唯一标识符。
- CRUD 操作:创建(Create)、读取(Read)、更新(Update)、删除(Delete)操作。
- 事务(Transactions):从 MongoDB 4.0 开始支持,允许一组操作作为一个原子单元执行。
- 操作符(Operators):用于查询和更新文档的特殊字段。
- 连接(Join):MongoDB 允许在查询中使用 $lookup 操作符来实现类似 SQL 的连接操作。
- TTL(Time - To - Live):可以为集合中的某些字段设置 TTL,以自动删除旧数据。
- 存储引擎(Storage Engine):MongoDB 用于数据存储和管理的底层技术,如 WiredTiger 和 MongoDB 的旧存储引擎 MMAPv1。
- MongoDB Compass:MongoDB 的图形界面工具,用于可视化和管理 MongoDB 数据。
- MongoDB Atlas:MongoDB 提供的云服务,允许在云中托管 MongoDB 数据库。
二:MongoDB安装
上传软件包
mongodb-database-tools-rhel70-x86_64-100.12.0.rpm
mongodb-linux-x86_64-rhel8-8.0.8.tgz
mongosh-2.5.0-linux-x64-openssl3.tar
openssl-1.1.1w.tar.gz
安装软件包
#安装依赖包
dnf -y install libcurl openssl
#解压安装包
tar zxvf mongodb-linux-x86_64-rhel8-8.0.8.tgz
#将解压包拷贝到指定目录
mv mongodb-linux-x86_64-rhel8-8.0.8 /usr/local/mongodb
cd /usr/local/mongodb
vim /etc/profileexport PATH=/usr/local/mongodb/bin:$PATH
#启动执行文件
source /etc/profile
#创建目录
mkdir -p /var/lib/mongo
mkdir -p /var/log/mongodb
编译安装openssl11
#由于mongodb依赖openssl11,需要编译安装openssl11
#安装依赖包
dnf -y install gcc perl
#解压安装包
tar zxvf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
#编译安装openssl11
./config --prefix=/opt/openssl11 --openssldir=/opt/openssl11/ssl
make -j2
make install
#设置openssl11环境变量
cd /opt
cd openssl11/
vim /etc/profileexport LD_LIBRARY_PATH=/opt/openssl11/lib:$LD_LIBRARY_PATH
#启动执行文件
source /etc/profile.d/openssl11.sh
#启动mongodb服务
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork##fork:守护进程
三:MongoDB Shell
1:安装MongoDB Shell
#解压安装包
tar zxvf mongosh-2.5.0-linux-x64-openssl3.tar
cd mongosh-2.5.0-linux-x64-openssl3
cd bin/
cp mongosh /usr/local/bin/
cp mongosh_crypt_vl.so /usr/local/bin/
2:验证MongoDB Shell
#验证
mongosh --host <hostname> --port <port>
mongosh
四:数据库管理
1:查看数据库列表
show dbs //查看当前mongodb中所有数据库的列表
db //查看当前正在使用的数据库
2:创建数据库
在 MongoDB 中,数据库的创建是一个简单的过程,当你首次向 MongoDB 中插入数据时,如果数据库不存在,MongoDB 会自动创建它。
我们只需选择一个数据库名称,并开始向其中插入文档即可。
当你使用 use 命令来指定一个数据库时,如果该数据库不存在,MongoDB 将自动创建它。
MongoDB 创建数据库的语法格式如下:
use DATABASE_NAME
如果数据库不存在,则创建数据库,否则切换到指定数据库。
示例:
#创建了数据库 runoob:
test> use runoob
switched to db runoob
runoob> db
runoob
#执行 use runoob 命令后,MongoDB 将创建名为 runoob 的新数据库。此时,你可以开始在这个数据库中创建集合和插入文档。#查看所有数据库,可以使用 show dbs 命令:
runoob> show dbs
admin 40.00 KiB
config 60.00 KiB
local 40.00 KiB
runoob>
3:删除数据库
如果你需要删除数据库,可以使用 db.dropDatabase () 方法:
use myDatabase
db.dropDatabase ()
上述命令将删除当前正在使用的 myDatabase 数据库及其所有集合。
示例:
runoob> show dbs
admin 40.00 KiB
config 60.00 KiB
local 40.00 KiB
runoob 40.00 KiB
runoob> use runoob
already on db runoobtest> db.dropDatabase ()
{ok: 1, dropped: "runoob"}
runoob> show dbs
admin 40.00 KiB
config 60.00 KiB
local 40.00 KiB
4:默认数据库
MongoDB 中默认的数据库为 test,如果您没有创建新的数据库,数据将存放在 test 数据库中。
当您通过 shell 连接到 MongoDB 实例时,如果未使用 use 命令切换到其他数据库,则会默认使用 test 数据库。
例如,在启动 MongoDB 实例并连接到 MongoDB shell 后,如果您开始插入文档而未显式指定数据库,MongoDB 将默认使用 test 数据库。
5:系统内置数据库
在 MongoDB 中,admin、config 和 local 是三个特殊的系统内置数据库
- admin 数据库:存储所有数据库的用户身份信息和全局权限(如 root 用户)。用户必须通过 admin 数据库认证后才能执行跨库管理操作。
- config 数据库:仅在分片集群环境中存在。存储分片信息、块(chunk)分布、集合分片策略等元数据。
- local 数据库:存储当前节点的副本集状态、操作日志(oplog)等本地数据。数据不会被复制到其他节点,仅存在于当前实例。
五:集合管理
1:查看集合
查看当前库已有集合,可以使用show collection 或 show tables命令
show collection;
2:创建集合
MongoDB 中使用 createCollection () 方法来创建集合。
语法格式:
db.createCollection(name, options)
参数说明:
- name:要创建的集合名称。
- options:可选参数,指定有关内存大小及索引的选项。
options 可以是如下参数:
参数名 | 类型 | 描述 | 示例值 |
---|---|---|---|
capped | 布尔值 | 是否创建一个固定大小的集合。 | true |
size | 数值 | 集合的最大大小(以字节为单位)。仅在 capped 为 true 时有效。 | 10485760(10MB) |
max | 数值 | 集合中允许的最大文档数。仅在 capped 为 true 时有效。 | 5000 |
validator | 对象 | 用于文档验证的表达式。 | { $jsonSchema: { ... } } |
validationLevel | 字符串 | 指定文档验证的严格程度。 "off":不进行验证。 "strict":插入和更新操作都必须通过验证 (默认)。 "moderate":仅现有文档更新时必须通过验证,插入新文档时不需要。 | "strict" |
validationAction | 字符串 | 指定文档验证失败时的操作。 "error":阻止插入或更新(默认)。 "warn":允许插入或更新,但会发出警告。 | "error" |
storageEngine | 对象 | 为集合指定存储引擎配置。 | { wiredTiger: { ..} } |
3:更新集合名
在 MongoDB 中,不能直接通过命令来重命名集合。MongoDB 可以使用 renameCollection 方法来重命名集合。renameCollection 命令的语法:
renameCollection 命令的语法:
db.adminCommand ({
renameCollection: "sourceDb.sourceCollection",
to: "targetDb.targetCollection",
dropTarget: <boolean>
})
参数说明:
- renameCollection:要重命名的集合的完全限定名称(包括数据库名)。
- to:目标集合的完全限定名称(包括数据库名)。
- dropTarget(可选):布尔值。如果目标集合已经存在,是否删除目标集合。默认值为 false。
4:删除集合
MongoDB 中使用 drop () 方法来删除集合。
drop () 方法可以永久地从数据库中删除指定的集合及其所有文档,这是一个不可逆的操作,因此需要谨慎使用。语法格式:
db.collection 名称.drop ()
如果成功删除选定集合,则 drop () 方法返回 true,否则返回 false。
实例
在数据库 mydb 中,我们可以先通过 show collections 命令查看已存在的集合:
use mydb
switched to db
db.createCollection("kgc")
{ ok: 1 }
mydb>show collections
kgc
六:文档操作
1:插入文档
文档的数据结构和 JSON 基本一样。所有存储在集合中的数据都是 BSON 格式,BSON 是一种类似 JSON 的二进制形式的存储格式,是 Binary JSON 的简称。
常用的插入文档方法包括:
方法 | 用途 | 是否弃用 |
---|---|---|
insertOne() | 插入单个文档 | 否 |
insertMany() | 插入多个文档 | 否 |
insert() | 插入单个或多个文档 | 是 |
save() | 插入或更新文档 | 是 |
在 MongoDB 中,插入文档时如果集合(Collection)不存在,数据库会自动创建该集合。这是 MongoDB 的默认行为,也是其无模式设计(Schema-less)的核心特性之一 。
insertOne()在集合中插入单个文档
语法:db.collection 名称.insertOne({插入单个文档名:"参数",,,})
inserMany()在集合中插入多个文档
语法:db.collection 名称.insertMany([{插入文档数组:"参数",,,},{插入文档数组:"参数",,,} ])
2:查询文档
- find () 方法
find () 方法以非结构化的方式来显示所有文档。
MongoDB 查询数据的语法格式如下:
db.collection.find (query, projection)
- query:用于查找文档的查询条件。默认为 {},即匹配所有文档。
- projection(可选):指定返回结果中包含或排除的字段。
实例
#查找所有文档:
db.myCollection.find ();
#按条件查找文档:
db.myCollection.find ({ age: { $gt: 25 } });说明:
$gt 是 MongoDB 的比较操作符,表示 “大于”(Greater Than)。
这个条件的作用是筛选出 age 字段值大于 25 的文档。#类似的其他比较操作符:
(小于)、gte(大于等于)、$lte(小于等于)
$eq(等于)、$ne(不等于)#按条件查找文档,并只返回指定字段:
db.myCollection.find (
{age: { $gt: 25} },
- findOne () 方法
findOne () 方法用于查找集合中的单个文档。如果找到多个匹配的文档,它只返回第一个。
语法:
db.collection.findOne (query, projection)
- query:用于查找文档的查询条件。默认为 {},即匹配所有文档。
- projection(可选):指定返回结果中包含或排除的字段。
#查找单个文档:
db.myCollection.findOne ({name: "Alice"});#查找单个文档,并只返回指定字段:
db.myCollection.findOne (
{name: "Alice"},
{ name: 1, age: 1, _id: 0 }
);
3:删除文档
- deleteOne()
deleteOne () 方法用于删除匹配过滤器的单个文档。
语法:
db.collection.deleteOne (filter, options)
- filter:用于查找要删除的文档的查询条件。
- options(可选):一个可选参数对象。
实例
db.myCollection.deleteOne ({name: "Alice"});
返回结果:
{
"acknowledged": true,
"deletedCount": 1
}deleteMany()
- deleteMany()
deleteMany () 方法用于删除所有匹配过滤器的文档。
语法:
db.collection.deleteMany (filter, options)
- filter:用于查找要删除的文档的查询条件。
- options(可选):一个可选参数对象。
4:更新文档
在 MongoDB 中,更新文档的操作可以使用多种方法实现,常用的方法包括 updateOne ()、updateMany ()、replaceOne () 和 findOneAndUpdate ()。插入测试数据:
db.myCollection.insertMany ([{name: "Alice", age: 25, city: "Los Angeles", status: "inactive"}, {name: "Bob", age: 30, city: "Los Angeles", status: "active"}, {name: "Charlie", age: 35, city: "Chicago", status: "active"}]);
- updateOne()
updateOne () 方法用于更新匹配过滤器的单个文档。
语法:
db.collection.updateOne (filter, update, options)
・filter:用于查找文档的查询条件。
・update:指定更新操作的文档或更新操作符。
・options:可选参数对象,如 upsert、arrayFilters 等。
实例
db.myCollection.updateOne (
{name: "Alice"}, // 过滤条件
{ $set: { age: 26 } }, // 更新操作
{ upsert: false } // 可选参数
);说明:
upsert 选项:
false(默认值):若没有匹配文档,不执行任何操作。
true:若未找到匹配文档,将插入一个新文档(合并查询条件和更新操作的内容)。
例如本案例,不匹配时会插入新文档 {name: "Alice", age: 26}
- updateMany()
updateMany () 方法用于更新所有匹配过滤器的文档。
语法:
db.collection.updateMany (filter, update, options)
- filter:用于查找文档的查询条件。
- update:指定更新操作的文档或更新操作符。
- options:可选参数对象,如 upsert、arrayFilters 等。
实例
db.myCollection.updateMany (
{ age: { $lt: 30 } }, // 过滤条件
{ $set: {status: "active"} }, // 更新操作
{ upsert: false } // 可选参数
);更新多个文档:
db.myCollection.updateMany (
{ age: { $lt: 30 } },
{ $set: { status: "active" } }
);
- replaceOne()
replaceOne () 方法用于替换匹配过滤器的单个文档,新的文档将完全替换旧的文档。
语法:
db.collection.replaceOne (filter, replacement, options)
- filter:用于查找文档的查询条件。
- replacement:新的文档,将替换旧的文档。
- options:可选参数对象,如 upsert 等。
实例
db.myCollection.replaceOne (
{name: "Bob"}, // 过滤条件
{ name: "Bob", age: 31 } // 新文档
);替换单个文档:
db.myCollection.replaceOne (
{name: "Bob"},
{ name: "Bob", age: 31 }
);
- findOneAndUpdate()
findOneAndUpdate () 方法用于查找并更新单个文档,可以选择返回更新前或更新后的文档
语法:
db.collection.findOneAndUpdate (filter, update, options)
・filter:用于查找文档的查询条件。
・update:指定更新操作的文档或更新操作符。
・options:可选参数对象,如 projection、sort、upsert、returnDocument 等。
实例
db.myCollection.findOneAndUpdate (
{name: "Charlie"}, // 过滤条件
{ $set: { age: 36 } }, // 更新操作
{ returnDocument: "after" } // 可选参数,返回更新后的文档
);查找并更新单个文档:
db.myCollection.findOneAndUpdate (
{name: "Charlie"},
{ $set: { age: 36 } },
{ returnDocument: "after" });
七:MongoDB备份与恢复
1:安装备份与恢复命令
#解压安装包
rpm -ivh mongodb-database-tools-rhel70-x86_64-100.12.0.rpm
2:MongoDB数据备份和恢复
备份:mongodump
恢复:mongorestore
八:MongoDB用户管理
1:编写配置文件
vim /usr/local/mongodb/mongod.conf
添加参数:
# 系统日志配置
systemLog:destination: filepath: /var/log/mongodb/mongod.loglogAppend: truetimeStampFormat: iso8601-utc# 存储配置
storage:dbPath: /var/lib/mongo# journal选项在8.0+版本已移除,journaling总是启用# 进程管理
processManagement:fork: truepidFilePath: /tmp/mongod.pid# 网络配置
net:bindIp: 127.0.0.1port: 27017# 安全配置
security:authorization: enabled
2:先启用非认证模式
#杀死进程
pkill mongod
#先启用非认证模式
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
#验证登录
mongosh --host localhost --port 27017
mongosh
#创建认证模式的用户和密码
use testdb
db.createUser({user:"zhangsan",pwd:"pwd123",roles:[role:"readWrite",db:"testdb",{role:"read",db:"testdb"}]})
exit
3:登录数据库
#杀死进程
pkill mongod
#启动mongodb服务
mongod -f /usr/local/mongodb/mongod.conf
或
mongod --auth --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
(认证模式)
#登录数据库
mongosh --host localhost --port 27017 -u "zhangsan" -p "pwd123" --authenticationDatabase "testdb"
#验证
>show collection;
4:只能在非认证的情况下删除用户
#杀死进程
pkill mongod
#先启用非认证模式
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
#登录数据库
mongosh --host localhost --port 27017
mongosh
use testdb
db.dropUser("zhangsan")