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 学习建议 #

  1. 动手实践:安装MongoDB,多写查询语句
  2. 理解原理:了解文档存储和索引机制
  3. 项目实战:结合实际项目学习
  4. 性能优化:学习索引和查询优化
  5. 持续学习:关注新版本特性

九、总结 #

MongoDB核心特点:

特点 说明
文档模型 灵活的数据结构
高性能 丰富的索引支持
高可用 复制集自动故障转移
可扩展 分片水平扩展
易用性 简单直观的API

下一步,让我们开始安装MongoDB!

最后更新:2026-03-27