目录
[一、 什么是 MongoDB](#一、 什么是 MongoDB)
[1. 主要特点](#1. 主要特点)
[2. MongoDB 概念解析](#2. MongoDB 概念解析)
[3. 完整术语列表](#3. 完整术语列表)
[二、 MongoDB 安装](#二、 MongoDB 安装)
[3. 创建数据目录](#3. 创建数据目录)
[4. 编译 OpensSSL](#4. 编译 OpensSSL)
[5. 启动 MOngoDB](#5. 启动 MOngoDB)
[三、 MongoDB Shell](#三、 MongoDB Shell)
[1. 安装 MongoDB Shell](#1. 安装 MongoDB Shell)
[2. 验证 MongoDB Shell](#2. 验证 MongoDB Shell)
[四、 数据库管理](#四、 数据库管理)
[1. 查看与切换数据库](#1. 查看与切换数据库)
[2. 创建与删除数据库](#2. 创建与删除数据库)
[五、 集合管理](#五、 集合管理)
[1. 查看集合](#1. 查看集合)
[2. 创建集合](#2. 创建集合)
[3. 更新集合名](#3. 更新集合名)
[4. 删除集合](#4. 删除集合)
[六、 文档操作](#六、 文档操作)
[1. 插入文档](#1. 插入文档)
[2. 查询文档](#2. 查询文档)
[3. 删除文档](#3. 删除文档)
[4. 更新文档](#4. 更新文档)
[七、 MongoDB 备份(mongodump)与恢复(mongorestore)](#七、 MongoDB 备份(mongodump)与恢复(mongorestore))
[1. 安装备份与恢复命令](#1. 安装备份与恢复命令)
[2. MongoDB 数据备份](#2. MongoDB 数据备份)
[3. MOngoDB 数据恢复](#3. MOngoDB 数据恢复)
[八、 MOngoDB 用户管理](#八、 MOngoDB 用户管理)
[1. 创建用户(切换到 testdb 数据库)](#1. 创建用户(切换到 testdb 数据库))
[2. 启用认证(修改mongod.conf)](#2. 启用认证(修改mongod.conf))
一、 什么是 MongoDB
MongoDB 是一个文档型数据库,数据以类似JSON 的文档形式存储。
MongoDB 的设计理念是为了应对大数据量、高性能和灵活性需求。
MongoDB使用集合(Collections)来组织文档(Documents),每个文档都是由键值对组成的。
- 数据库(Database):存储数据的容器,类似于关系型数据库中的数据库。
- 集合(Collection):数据库中的一个集合,类似于关系型数据库中的表。
- 文档(Document):集合中的一个数据记录,类似于关系型数据库中的行(row),以 BSON 格式存储。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成,文档类似于JSON 对象,字段值可以包含其他文档,数组及文档数组:
1. 主要特点
- 文档导向的存储:MongoDB 是一个面向文档的数据库,它以JSON-1ike 的格式存储数据,使得数据结构更加灵活和丰富。
- 索引优化查询:MongoDB 允许用户为文档中的任意属性创建索引,例如FirstName 和 Address,从而提高查询效率和排序性能。
- 数据镜像与扩展性:通过本地或网络创建数据的副本,MongoDB 实现了强大的数据冗余和扩展能力。
- 水平扩展与分片:面对增加的负载,MongoDB 可以通过分片技术将数据分布到计算机网2络中的其他节点上,实现水平扩展。
- 强大的查询语言: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、AVA、C++、PHP 和C#。
2. MongoDB 概念解析
不管我们学习什么数据库都应该学习其中的基础概念,在 MongoDB 中基本的概念是文档、集合、数据库,下面我们挨个介绍。
下表将帮助您更容易理解 MongoDB 中的一些概念:
|-------------|---------------|----------------------------|
| 5QL 术语/概念 | 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 文档大小限制的文件的规范。
- 0bjectId: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 安装
1.安装依赖文件
dnf install libcurl openssl -y
2.解压与配置
# 解压安装包 tar -zxvf mongodb-linux-x86_64-rhel8-8.0.8.tgz # 移动到指定目录 mv mongodb-linux-x86_64-rhel8-8.0.8 /usr/local/mongodb # 添加环境变量(永久生效) echo 'export PATH=/usr/local/mongodb/bin:$PATH' >> /etc/profile source /etc/profile
3. 创建数据目录
mkdir -p /var/lib/mongo /var/log/mongodb chown `whoami` /var/lib/mongo /var/log/mongodb # 赋予当前用户权限
4. 编译 OpensSSL
dnf install -y gcc make perl tar xzf openssl-1.1.1w.tar.gz cd openssl-1.1.1w ./config --prefix=/opt/openssl111 --openssldir=/opt/openssl111/ssl make -j$(nproc) && make install # 配置环境变量 echo 'export LD_LIBRARY_PATH=/opt/openssl111/lib:$LD_LIBRARY_PATH' | sudo tee /etc/profile.d/openssl111.sh source /etc/profile.d/openssl111.sh
5. 启动 MOngoDB
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork # 验证启动:查看日志或进程,出现"child process started successfully"则成功
三、 MongoDB Shell
1. 安装 MongoDB Shell
tar xzf mongosh-2.5.0-linux-x64-openssl3.tgz cd mongosh-2.5.0-linux-x64-openssl3/bin/ cp mongosh /usr/local/bin/ cp mongosh_crypt_v1.so /usr/local/lib/
2. 验证 MongoDB Shell
mongosh # 本地默认连接(127.0.0.1:27017) # 成功提示:Connected to: mongodb://127.0.0.1:27017/...
四、 数据库管理
1. 查看与切换数据库
show dbs; // 列出所有数据库(需包含数据才会显示) use runoob; // 切换/创建数据库(无数据时show dbs不显示) db; // 查看当前数据库
2. 创建与删除数据库
// 插入数据自动创建数据库 db.runoob.insertOne({name: "zhangsan"}); show dbs; // 此时runoob数据库可见 // 删除数据库(先切换到目标库) use myDatabase; db.dropDatabase();
五、 集合管理
1. 查看集合
show collections; // 或 show tables
2. 创建集合
db.createCollection("myComplexCollection", { capped: true, // 固定大小 size: 10485760, // 10MB max: 5000, // 最多5000条 validator: { // 文档校验 $jsonSchema: { bsonType: "object", required: ["name", "email"], properties: { name: { bsonType: "string" }, email: { bsonType: "string", pattern: ".+@.+" } } } } });
3. 更新集合名
db.adminCommand({ renameCollection: "test.oldCollection", to: "test.newCollection" });
4. 删除集合
db.kgc.drop(); // 删除kgc集合,返回true则成功
六、 文档操作
1. 插入文档
db. myCollection.insertOne({ name: "Alice", age:25, city: "New York" }): #返回结果 {"acknowledged": true, "insertedId": 0bjectId("60c72b2f9bld8b5a5f8e2b2d")}
2. 查询文档
find():批量查询 // 查询所有文档,仅返回name和age(排除_id) db.myCollection.find( {}, { name: 1, age: 1, _id: 0 } ).pretty(); // 格式化输出 findOne():单文档查询 // 查询name为"Alice"的文档 db.myCollection.findOne({ name: "Alice" });
3. 删除文档
deleteOne():删单条 db.myCollection.deleteOne({ name: "Alice" }); deleteMany():删多条 db.myCollection.deleteMany({ name: "Bob" }); findOneAndDelete():删除并返回 db.myCollection.findOneAndDelete({ name: "Charlie" });
4. 更新文档
先插入测试数据
db.myCollection.insertMany([ { name: "Alice", age: 25, status: "inactive" }, { name: "Bob", age: 30, status: "active" } ]);
updateOne():更新单条 db.myCollection.updateOne( { name: "Alice" }, { $set: { age: 26 } } ); updateMany():更新多条 db.myCollection.updateMany( { age: { $lt: 30 } }, { $set: { status: "active" } } ); replaceOne():替换文档 db.myCollection.replaceOne( { name: "Bob" }, { name: "Bob", age: 31, city: "New York" } ); findOneAndUpdate():更新并返回 db.myCollection.findOneAndUpdate( { name: "Charlie" }, { $set: { age: 36 } }, { returnDocument: "after" } // 返回更新后的数据 );
七、 MongoDB 备份(mongodump)与恢复(mongorestore)
1. 安装备份与恢复命令
rpm -ivh mongodb-database-tools-rhel70-x86_64-100.12.0.rpm
2. MongoDB 数据备份
# 备份test数据库到/data/backup mongodump -h 127.0.0.1:27017 -d test -o /data/backup
3. MOngoDB 数据恢复
# 从备份恢复test数据库(覆盖现有数据) mongorestore -h 127.0.0.1:27017 -d test --drop /data/backup/test
八、 MOngoDB 用户管理
1. 创建用户(切换到 testdb 数据库)
use testdb; db.createUser({ user: "testuser", pwd: "password123", roles: [ { role: "readWrite", db: "testdb" }, { role: "read", db: "testdb" } ] });
2. 启用认证(修改mongod.conf
)
security: authorization: "enabled"
3.认证登录
mongosh --host 127.0.0.1:27017 -u "testuser" -p "password123" --authenticationDatabase "testdb"
4.删除用户
use testdb; db.dropUser("testuser");