MongoDB简介 #
一、什么是MongoDB #
1.1 NoSQL数据库概述 #
NoSQL(Not Only SQL)是指非关系型数据库,用于处理大规模数据存储和访问。
text
关系型数据库(RDBMS)
├── 表结构固定
├── SQL查询语言
├── ACID事务
└── 垂直扩展
NoSQL数据库
├── 灵活的数据模型
├── 多种查询方式
├── BASE理论
└── 水平扩展
1.2 MongoDB定义 #
MongoDB是一个基于分布式文件存储的开源文档数据库,由C++语言编写。
| 特性 | 说明 |
|---|---|
| 文档型 | 以文档为单位存储数据,类似JSON |
| 无模式 | 同一集合中的文档可以有不同字段 |
| 高性能 | 支持索引,查询效率高 |
| 高可用 | 支持复制集,自动故障转移 |
| 可扩展 | 支持分片,水平扩展 |
二、MongoDB发展历史 #
2.1 诞生背景 #
text
2007年 10gen公司成立,开发PaaS平台
↓
2009年 MongoDB开源发布
↓
2010年 MongoDB 1.4发布,支持分片
↓
2012年 MongoDB 2.2发布,支持聚合框架
↓
2015年 MongoDB 3.0发布,WiredTiger引擎
↓
2018年 MongoDB 4.0发布,支持事务
↓
2023年 MongoDB 7.0发布,增强查询能力
↓
至今 持续更新迭代
2.2 版本演进 #
| 版本 | 年份 | 主要特性 |
|---|---|---|
| 1.0 | 2009 | 基本文档存储 |
| 1.4 | 2010 | 分片、复制集 |
| 2.2 | 2012 | 聚合框架 |
| 2.6 | 2014 | 文本搜索、聚合增强 |
| 3.0 | 2015 | WiredTiger引擎、可插拔存储 |
| 3.2 | 2015 | 文档验证、部分索引 |
| 3.4 | 2016 | 视图、排序规则 |
| 4.0 | 2018 | 多文档事务 |
| 4.2 | 2019 | 分布式事务、通配符索引 |
| 4.4 | 2020 | 隐藏索引、复合哈希索引 |
| 5.0 | 2021 | 时序集合、窗口函数 |
| 6.0 | 2022 | 变更流增强、查询优化 |
| 7.0 | 2023 | 聚合增强、查询优化 |
2.3 MongoDB Inc. #
| 产品 | 说明 |
|---|---|
| MongoDB Community | 社区版,开源免费 |
| MongoDB Enterprise | 企业版,提供高级功能 |
| MongoDB Atlas | 云托管服务 |
| MongoDB Compass | 图形化管理工具 |
三、MongoDB特点 #
3.1 优点 #
1. 灵活的数据模型
javascript
// 文档结构灵活,无需预定义
{
"_id": ObjectId("507f1f77bcf86cd799439011"),
"name": "John",
"age": 25,
"email": "john@example.com"
}
// 另一个文档可以有不同字段
{
"_id": ObjectId("507f1f77bcf86cd799439012"),
"name": "Jane",
"address": {
"city": "Beijing",
"street": "Chaoyang Road"
},
"hobbies": ["reading", "swimming"]
}
2. 高性能
javascript
// 支持丰富的索引类型
db.users.createIndex({ name: 1 })
// 查询优化器自动选择最优执行计划
db.users.find({ name: "John" }).explain("executionStats")
3. 高可用性
text
复制集架构
┌─────────────────────────────────────┐
│ Primary (主节点) │
│ 读写操作 │
└──────────────┬──────────────────────┘
│
┌───────┴───────┐
▼ ▼
┌─────────────┐ ┌─────────────┐
│ Secondary │ │ Secondary │
│ (从节点) │ │ (从节点) │
│ 只读 │ │ 只读 │
└─────────────┘ └─────────────┘
4. 水平扩展
text
分片集群架构
┌─────────────────────────────────────┐
│ mongos (路由) │
└──────────────┬──────────────────────┘
│
┌───────┼───────┐
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Shard 1 │ │ Shard 2 │ │ Shard 3 │
│ (分片1) │ │ (分片2) │ │ (分片3) │
└─────────┘ └─────────┘ └─────────┘
5. 丰富的查询语言
javascript
// 条件查询
db.users.find({ age: { $gt: 18 } })
// 聚合管道
db.orders.aggregate([
{ $match: { status: "completed" } },
{ $group: { _id: "$userId", total: { $sum: "$amount" } } }
])
// 文本搜索
db.articles.find({ $text: { $search: "MongoDB" } })
6. 支持事务
javascript
// 多文档事务(MongoDB 4.0+)
const session = db.getMongo().startSession()
session.startTransaction()
try {
db.accounts.updateOne(
{ _id: 1 },
{ $inc: { balance: -100 } },
{ session }
)
db.accounts.updateOne(
{ _id: 2 },
{ $inc: { balance: 100 } },
{ session }
)
session.commitTransaction()
} catch (error) {
session.abortTransaction()
}
3.2 缺点 #
1. 关系处理
复杂关联查询不如关系型数据库方便。
javascript
// MongoDB需要多次查询或使用$lookup
db.orders.aggregate([
{
$lookup: {
from: "users",
localField: "userId",
foreignField: "_id",
as: "user"
}
}
])
2. 事务开销
多文档事务会增加性能开销。
3. 存储空间
文档存储可能比关系型数据库占用更多空间。
4. 学习曲线
需要理解文档模型和聚合管道等概念。
四、MongoDB应用领域 #
4.1 Web应用 #
text
┌─────────────────────────────────────┐
│ Web应用架构 │
├─────────────────────────────────────┤
│ 浏览器 → Node.js/Python/Java │
│ ↓ │
│ MongoDB数据库 │
└─────────────────────────────────────┘
典型应用:
- 内容管理系统(CMS)
- 博客平台
- 社交网络
- 电商网站
4.2 移动应用后端 #
text
移动App
↓
API服务器
↓
MongoDB数据库
↓
{
"userId": "123",
"device": "iPhone",
"location": { "lat": 39.9, "lng": 116.4 },
"lastActive": ISODate("2024-01-01T00:00:00Z")
}
4.3 物联网(IoT) #
javascript
// 存储传感器数据
{
"deviceId": "sensor_001",
"type": "temperature",
"value": 25.5,
"unit": "°C",
"timestamp": ISODate("2024-01-01T12:00:00Z"),
"location": {
"building": "A",
"floor": 3,
"room": "301"
}
}
// 时序集合(MongoDB 5.0+)
db.createCollection("sensorData", {
timeseries: {
timeField: "timestamp",
metaField: "deviceId",
granularity: "minutes"
}
})
4.4 实时分析 #
javascript
// 实时数据聚合
db.events.aggregate([
{
$match: {
timestamp: {
$gte: new Date("2024-01-01"),
$lt: new Date("2024-02-01")
}
}
},
{
$group: {
_id: {
year: { $year: "$timestamp" },
month: { $month: "$timestamp" },
day: { $dayOfMonth: "$timestamp" }
},
count: { $sum: 1 },
uniqueUsers: { $addToSet: "$userId" }
}
}
])
4.5 日志管理 #
javascript
// 存储应用日志
{
"level": "error",
"message": "Database connection failed",
"service": "api-server",
"timestamp": ISODate("2024-01-01T12:00:00Z"),
"stack": "Error: Connection timeout...",
"metadata": {
"host": "server-01",
"pid": 12345
}
}
五、MongoDB架构 #
5.1 存储架构 #
text
┌─────────────────────────────────────────┐
│ MongoDB实例 │
├─────────────────────────────────────────┤
│ 数据库(Database) │
├─────────────────────────────────────────┤
│ 集合(Collection) │
├─────────────────────────────────────────┤
│ 文档(Document) │
├─────────────────────────────────────────┤
│ 字段(Field) │
└─────────────────────────────────────────┘
5.2 存储引擎 #
| 存储引擎 | 说明 |
|---|---|
| WiredTiger | 默认引擎,支持压缩、并发控制 |
| In-Memory | 内存存储,极致性能 |
| MMAPv1 | 旧版引擎,已废弃 |
5.3 数据文件 #
text
/data/db/
├── WiredTiger # 存储引擎文件
├── WiredTiger.lock # 锁文件
├── WiredTiger.wt # 配置文件
├── _mdb_catalog.wt # 目录文件
├── collection-*.wt # 集合数据文件
└── index-*.wt # 索引数据文件
六、MongoDB与关系型数据库对比 #
6.1 概念对比 #
| MongoDB | 关系型数据库 |
|---|---|
| 数据库(Database) | 数据库(Database) |
| 集合(Collection) | 表(Table) |
| 文档(Document) | 行(Row) |
| 字段(Field) | 列(Column) |
| 嵌套文档 | 关联表 |
| 数组字段 | 一对多关系表 |
6.2 特性对比 #
| 特性 | MongoDB | MySQL |
|---|---|---|
| 数据模型 | 文档型 | 关系型 |
| 模式 | 无模式 | 固定模式 |
| 查询语言 | MongoDB查询语言 | SQL |
| 事务 | 支持(4.0+) | 原生支持 |
| 扩展方式 | 水平扩展 | 垂直扩展 |
| JOIN | $lookup | 原生JOIN |
| 索引 | B树、文本、地理空间 | B树、哈希 |
6.3 选择建议 #
| 场景 | 推荐数据库 |
|---|---|
| 灵活的数据结构 | MongoDB |
| 复杂关联查询 | MySQL |
| 大量非结构化数据 | MongoDB |
| 高并发读写 | MongoDB |
| 严格事务要求 | MySQL |
| 快速迭代开发 | MongoDB |
七、为什么学习MongoDB #
7.1 市场需求 #
text
NoSQL数据库技能需求排名(2024)
┌─────────────────────┐
│ 1. MongoDB ████ │
│ 2. Redis ███ │
│ 3. Cassandra ██ │
│ 4. DynamoDB ██ │
│ 5. Couchbase █ │
└─────────────────────┘
7.2 学习价值 #
1. 技能基础
text
MongoDB学习
├── 文档数据库设计
├── NoSQL数据建模
├── 查询优化
└── 分布式系统
2. 职业发展
| 职位 | MongoDB技能要求 |
|---|---|
| 后端开发 | 精通 |
| DBA | 精通 |
| 全栈开发 | 熟练 |
| 数据工程师 | 熟练 |
| 架构师 | 精通 |
7.3 学习路线 #
text
入门阶段
├── 安装配置
├── 基本语法
├── 数据类型
└── 简单查询
进阶阶段
├── 聚合管道
├── 索引优化
├── 复制集
└── 事务处理
高级阶段
├── 分片集群
├── 性能调优
├── 安全管理
└── 运维监控
八、MongoDB学习资源 #
8.1 官方资源 #
| 资源 | 地址 |
|---|---|
| 官方文档 | https://www.mongodb.com/docs/ |
| 官方网站 | https://www.mongodb.com/ |
| MongoDB University | https://university.mongodb.com/ |
8.2 学习建议 #
- 动手实践:安装MongoDB,多写查询语句
- 理解原理:了解文档存储和索引机制
- 项目实战:结合实际项目学习
- 性能优化:学习索引和查询优化
- 持续学习:关注新版本特性
九、总结 #
MongoDB核心特点:
| 特点 | 说明 |
|---|---|
| 文档模型 | 灵活的数据结构 |
| 高性能 | 丰富的索引支持 |
| 高可用 | 复制集自动故障转移 |
| 可扩展 | 分片水平扩展 |
| 易用性 | 简单直观的API |
下一步,让我们开始安装MongoDB!
最后更新:2026-03-27