MongoDB 入门

发布于:2025-06-14 ⋅ 阅读:(30) ⋅ 点赞:(0)

目录

简介

一、MongoDB 的概念与特点

1.1 什么是 MongoDB

1.2 核心概念映射

1.3 关键特性优势

二、Linux 环境下 MongoDB 安装与配置

2.1 准备工作与依赖安装

2.2 下载与解压安装包

2.3 配置环境变量

2.4 创建数据与日志目录

2.5 编译安装 OpenSSL 1.1

2.6 设置 OpenSSL 环境变量

2.7 启动 MongoDB 服务

三、MongoDB Shell(mongosh)

3.1 安装 mongosh 工具

3.2 连接与验证

四、数据库基本操作

4.1 查看与切换数据库

4.2 创建数据库实例

4.3 删除数据库

4.4 系统内置数据库

五、集合(Collection)管理

5.1 查看与创建集合

5.2 创建复杂配置集合

5.3 重命名集合

5.4 删除集合

六、文档(Document)CRUD 操作

6.1 插入文档

6.2 查询文档

6.3 删除文档

6.4 更新文档

七、数据备份与恢复

7.1 安装备份工具

7.2 数据备份(mongodump)

7.3 数据恢复(mongorestore)

八、用户管理与权限控制

8.1 创建用户与分配角色

8.2 用户认证

8.3 启用访问控制

8.4 带认证登录

8.5 删除用户

九、总结


简介

MongoDB 作为现代应用开发中最流行的非关系型数据库之一,以其灵活的数据模型和强大的扩展能力,在大数据和高并发场景中展现出独特优势。本文将从基础概念出发,逐步深入到安装配置、核心操作和高级管理,为你构建完整的 MongoDB 知识体系。

一、MongoDB 的概念与特点

1.1 什么是 MongoDB

MongoDB 是一个基于文档存储的非关系型数据库(NoSQL),采用类似 JSON 的 BSON(Binary JSON)格式存储数据,打破了传统关系型数据库的表结构限制,提供了极高的数据灵活性。其核心设计理念是应对大数据量、高性能和灵活扩展的需求,特别适合内容管理、实时分析和物联网等场景。

1.2 核心概念映射

MongoDB 的数据模型与传统关系型数据库有对应关系,但更具灵活性:

SQL 术语

MongoDB 术语

说明

database

database

数据库容器

table

collection

文档集合,无需固定模式

row

document

数据文档,BSON 格式存储

column

field

文档字段

index

index

索引,支持任意字段创建

primary key

_id

主键,自动生成唯一标识符

table joins

不支持

采用嵌入式数据模型替代关联

1.3 关键特性优势
  • 文档导向存储:JSON-like 格式存储,支持嵌套文档和数组,天然适合复杂数据结构
  • 灵活索引机制:可对任意字段创建索引,包括单字段、复合字段和地理空间索引
  • 水平扩展能力:通过分片(Sharding)技术将数据分布到多个节点,应对海量数据
  • 副本集高可用:通过数据镜像实现冗余备份,主从节点自动故障转移
  • 强大查询语言:支持丰富的查询操作符,如 ​​$gt​​​、​​$in​​​、​​$regex​​,可查询嵌套对象
  • MapReduce 处理:内置大规模数据聚合处理能力,支持 JavaScript 脚本
  • GridFS 大文件存储:原生支持存储超过 BSON 限制的文件(如图片、视频)

二、Linux 环境下 MongoDB 安装与配置

2.1 准备工作与依赖安装

首先安装必要的依赖包,确保编译环境和网络支持:

# 安装编译工具和网络库
dnf install libcurl openssl gcc make perl -y

解释:​​libcurl​​​ 用于网络通信,​​openssl​​​ 提供加密支持,​​gcc/make/perl​​ 用于编译 OpenSSL 和 MongoDB 相关组件。

2.2 下载与解压安装包

从官网下载对应版本的安装包并解压:

# 假设下载的是 8.0.8 版本
tar -zxvf mongodb-linux-x86_64-rhel8-8.0.8.tgz
# 移动到指定安装目录
mv mongodb-linux-x86_64-rhel8-8.0.8 /usr/local/mongodb
2.3 配置环境变量

将 MongoDB 可执行文件路径添加到系统 PATH:

# 写入环境变量配置
echo 'export PATH=/usr/local/mongodb/bin:$PATH' > /etc/profile
# 立即生效配置
source /etc/profile

解释:通过修改 ​​/etc/profile​​​ 使所有用户都能访问 ​​mongod​​​、​​mongosh​​​ 等命令,​​source​​ 命令无需重启即可生效。

2.4 创建数据与日志目录
# 创建数据存储目录
mkdir -p /var/lib/mongo
# 创建日志文件目录
mkdir -p /var/log/mongodb
# 设置当前用户权限
chown whoami /var/lib/mongo
chown whoami /var/log/mongodb

说明:MongoDB 默认会尝试读取这两个目录,​​whoami​​ 确保当前用户(通常是 root)有读写权限。

2.5 编译安装 OpenSSL 1.1
# 解压 OpenSSL 源码
tar xzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
# 配置安装路径
./config -prefix=/opt/openssl11 --openssldir=/opt/openssl/ssl
# 编译并安装(-j$(nproc) 利用多核编译)
make -j$(nproc)
make install
2.6 设置 OpenSSL 环境变量
# 写入动态库路径配置
echo 'export LD_LIBRARY_PATH=/opt/openssl11/lib:$LD_LIBRARY_PATH' | sudo tee /etc/profile.d/openssl11.sh
# 生效配置
source /etc/profile.d/openssl11.sh
2.7 启动 MongoDB 服务
# 后台启动服务,指定数据和日志路径
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork

输出验证

child process started successfully, parent exiting forked process: 12102

看到上述信息表示服务启动成功,MongoDB 默认监听 27017 端口。

三、MongoDB Shell(mongosh)

3.1 安装 mongosh 工具
# 解压安装包
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/
3.2 连接与验证
# 连接本地 MongoDB(默认端口 27017)
mongosh

连接成功输出

Current Mongosh Log ID: 680a1533277aa1c07b1b26ff
Connecting to: mongodb://127.0.0.1:27017/directConnection=true...
Using MongoDB: 8.0.8
Using Mongosh: 2.5.0
test>

警告说明

  • ​XFS filesystem recommended​​:建议使用 XFS 文件系统以优化 WiredTiger 存储引擎
  • ​Access control is not enabled​​:生产环境需启用访问控制
  • ​bound to localhost​​​:默认仅本地访问,如需远程连接需配置 ​​--bind_ip​

四、数据库基本操作

4.1 查看与切换数据库
// 查看所有数据库
show dbs
// 查看当前使用的数据库
db
// 切换/创建数据库(插入数据后才会实际创建)
use runoob
4.2 创建数据库实例
// 创建并切换到 runoob 数据库
use runoob
// 插入数据使数据库生效
db.runoob.insertOne({name: "zhangsan"})
// 再次查看数据库列表
show dbs

输出结果

admin   40.00 KiB
config  60.00 KiB
local   40.00 KiB
runoob  40.00 KiB
4.3 删除数据库
// 切换到要删除的数据库
use runoob
// 删除当前数据库
db.dropDatabase()
// 验证删除结果
show dbs
4.4 系统内置数据库
  • admin:存储用户认证信息和全局权限,认证后可执行跨库操作
  • config:分片集群中存储分片元数据(块分布、分片策略)
  • local:存储当前节点的副本集状态和操作日志(oplog),不复制到其他节点

五、集合(Collection)管理

5.1 查看与创建集合
// 查看当前库的集合
show collections
// 创建普通集合(插入数据后才会实际创建)
db.createCollection("myCollection")
5.2 创建复杂配置集合
// 创建固定大小、带验证的集合
db.createCollection("myComplexCollection", {
  capped: true,              // 固定大小集合
  size: 10485760,            // 最大 10MB
  max: 5000,                 // 最多 5000 个文档
  validator: {               // 文档验证规则
    $jsonSchema: {
      bsonType: "object",
      required: ["name", "email"],
      properties: {
        name: { bsonType: "string", description: "必填字符串" },
        email: { bsonType: "string", pattern: ".+@.+", description: "有效邮箱" }
      }
    }
  },
  validationLevel: "strict",  // 严格验证(插入更新都需通过)
  validationAction: "error",  // 验证失败则阻止操作
  storageEngine: {            // 存储引擎配置
    wiredTiger: { configString: "block_compressor=zstd" }
  },
  collation: { locale: "en", strength: 2 }  // 排序规则
})
5.3 重命名集合
// 同数据库重命名
db.adminCommand({
  renameCollection: "test.oldCollection",
  to: "test.newCollection"
})
// 跨数据库重命名
db.adminCommand({
  renameCollection: "test.oldCollection",
  to: "production.newCollection"
})

参数说明:​​dropTarget​​ 可选参数,若目标集合存在则删除(默认 false)。

5.4 删除集合
// 删除 mydb 库中的 kgc 集合
use mydb
db.kgc.drop()
// 验证删除结果
show collections

六、文档(Document)CRUD 操作

6.1 插入文档

6.1.1 插入单个文档

// 插入单个文档
db.myCollection.insertOne({
  name: "Alice",
  age: 25,
  city: "New York",
  hobbies: ["reading", "music"]
})

返回结果

{
  acknowledged: true,
  insertedId: ObjectId("60c72b2f9b1d8b5a5f8e2b2d")
}

6.1.2 插入多个文档

// 插入多个文档
db.myCollection.insertMany([
  { name: "Bob", age: 30, city: "Los Angeles", status: "active" },
  { name: "Charlie", age: 35, city: "Chicago", status: "active" }
])
6.2 查询文档

6.2.1 基础查询

// 查询所有文档
db.myCollection.find()
// 按条件查询(age > 25)
db.myCollection.find({ age: { $gt: 25 } })
// 带投影查询(只返回 name 和 age,排除 _id)
db.myCollection.find(
  { age: { $gt: 25 } },
  { name: 1, age: 1, _id: 0 }
)
// 格式化输出
db.myCollection.find().pretty()

6.2.2 单个文档查询

// 查询单个文档
db.myCollection.findOne({ name: "Alice" })
// 带投影的单个文档查询
db.myCollection.findOne(
  { name: "Alice" },
  { name: 1, age: 1, _id: 0 }
)
6.3 删除文档

6.3.1 删除单个文档

// 删除 name 为 Alice 的文档
db.myCollection.deleteOne({ name: "Alice" })

返回结果

{ acknowledged: true, deletedCount: 1 }

6.3.2 删除多个文档

// 删除所有 name 为 Bob 的文档
db.myCollection.deleteMany({ name: "Bob" })

6.3.3 查找并删除

// 查找并删除,返回删除的文档
db.myCollection.findOneAndDelete(
  { name: "Charlie" },
  { projection: { name: 1, age: 1 } }
)
6.4 更新文档

6.4.1 更新单个文档

// 将 Alice 的年龄更新为 26
db.myCollection.updateOne(
  { name: "Alice" },
  { $set: { age: 26 } },
  { upsert: false }  // 不存在不插入
)

6.4.2 更新多个文档

// 将年龄小于 30 的用户状态设为 active
db.myCollection.updateMany(
  { age: { $lt: 30 } },
  { $set: { status: "active" } }
)

6.4.3 替换文档

// 完全替换 Bob 的文档
db.myCollection.replaceOne(
  { name: "Bob" },
  { name: "Bob", age: 31, city: "San Francisco" }
)

6.4.4 查找并更新

// 查找并更新,返回更新后的文档
db.myCollection.findOneAndUpdate(
  { name: "Charlie" },
  { $set: { age: 36 } },
  { returnDocument: "after" }
)

七、数据备份与恢复

7.1 安装备份工具
# 安装 MongoDB 数据库工具
rpm -ivh mongodb-database-tools-rhel70-x86_64-100.12.0.rpm
7.2 数据备份(mongodump)
# 备份所有数据库到当前目录的 dump 文件夹
mongodump
# 备份指定数据库(如 test)
mongodump -d test -o /data/backup/test
# 备份指定集合
mongodump -d test -c myCollection -o /data/backup/collection
# 备份远程数据库
mongodump -h 192.168.1.100:27017 -u username -p password -d mydb

备份输出示例

2025-04-25T22:44:21.307+0800 writing admin.system.version to dump/admin/system.version.bson
2025-04-25T22:44:21.313+0800 done dumping test.myCollection (3 documents)
7.3 数据恢复(mongorestore)
# 从默认 dump 目录恢复所有数据
mongorestore
# 恢复到指定数据库(如 test2)
mongorestore -d test2 /data/backup/test
# 恢复时先删除现有数据(慎用)
mongorestore --drop -d test /data/backup/test
# 恢复远程数据库
mongorestore -h 192.168.1.100:27017 -u username -p password -d mydb /data/backup/mydb

恢复输出示例

2025-04-25T22:50:28.125+0800 restoring test.myCollection from dump/test/myCollection.bson
2025-04-25T22:50:28.151+0800 6 document(s) restored successfully.

八、用户管理与权限控制

8.1 创建用户与分配角色
// 切换到目标数据库(如 testdb)
use testdb
// 创建用户并分配角色
db.createUser({
  user: "testuser",
  pwd: "password123",
  roles: [
    { role: "readWrite", db: "testdb" },  // 读写权限
    { role: "dbAdmin", db: "testdb" }     // 数据库管理权限
  ]
})
8.2 用户认证
// 验证用户身份
db.auth("testuser", "password123")
// 返回 1 表示认证成功
8.3 启用访问控制

8.3.1 配置文件启用

修改 ​​mongod.conf​​ 添加:

security:
  authorization: "enabled"

8.3.2 命令行启用

mongod --auth --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
8.4 带认证登录
mongosh --host localhost --port 27017 -u "testuser" -p "password123" --authenticationDatabase "testdb"
8.5 删除用户
// 删除 testuser 用户
db.dropUser("testuser")

九、总结

在实际应用中,还需注意以下最佳实践:

  1. 数据模型设计:利用 MongoDB 的文档嵌套特性,减少关联查询,遵循 "One Document, One Entity" 原则
  2. 索引优化:为高频查询字段创建索引,避免全表扫描,定期分析查询计划(​​explain()​​)
  3. 分片策略:大数据量场景提前规划分片键,确保数据均匀分布
  4. 备份策略:定期增量备份,异地存储备份文件,测试恢复流程
  5. 安全配置:生产环境必须启用认证,限制网络访问,使用专用管理账户
  6. 监控告警:关注数据库连接数、内存使用、磁盘IO等指标,设置告警阈值

MongoDB 的灵活性和扩展性为现代应用开发提供了强大支持,随着业务发展,合理运用其高级特性(如聚合框架、地理空间查询、事务支持)将进一步释放其潜力。


网站公告

今日签到

点亮在社区的每一天
去签到