Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

MongoDB 基础教程

MongoDB 详细介绍:核心概念 + 底层原理 + 应用场景 + 最佳实践),偏工程化、架构化

🧩 1. MongoDB 是什么?

MongoDB 是一个 文档型 NoSQL 数据库,使用 BSON(二进制 JSON)存储数据,具有:

  • 无模式 Schema-less
  • 水平扩展能力强(Sharding)
  • 高性能读写
  • 原生复制集高可用(Replica Set)
  • 丰富查询能力(聚合管道、索引等)
  • 支持多文档事务(4.0+)

它非常适合存储 非结构化、半结构化、大规模、高并发数据。

🧩 2. MongoDB 的核心概念

2.1 文档(Document)

MongoDB 基本单位,相当于关系数据库里的“行”。

示例文档(BSON -> JSON 示例):

{
  "_id": "647fa0b1",
  "name": "martin",
  "age": 28,
  "tags": ["IT", "photography"],
  "profile": {
    "city": "NY",
    "followers": 12000
  }
}

特点:

  • 字段灵活,可嵌套文档、数组。
  • 不需要统一 schema。

2.2 集合(Collection)

类似关系数据库的“表”,但无固定字段结构。

2.3 数据库(Database)

和传统概念一致,用于组织集合。

2.4 BSON(Binary JSON)

高性能二进制格式,支持 JSON 不支持的数据类型,如:

  • Date
  • Binary
  • Decimal128
  • ObjectId

2.5 _id 字段

每个文档必须有 _id(唯一索引)。

默认使用 ObjectId(12 字节、可排序)。

🧩 3. MongoDB 的核心功能

3.1 高性能读写

  • 文档为基本单元 -> 少 JOIN -> 快
  • WiredTiger 存储引擎 -> 压缩 + 行级并发控制(文档级锁)
  • 内存缓存(存储引擎 cache)大幅减少磁盘 IO

3.2 灵活的数据模型

  • 无固定 schema
  • 支持嵌套结构
  • 适合快速迭代的业务(社交、电商、IoT)

3.3 强大的查询能力

包括:

  • 字段筛选
  • 范围查询
  • 索引支持(B-tree)
  • 数组匹配
  • 地理位置查询
  • Aggregation Pipeline(强大的数据分析能力)

示例:

db.users.aggregate([
  { $match: { city: "NY" }},
  { $group: { _id: "$gender", count: { $sum: 1 } }},
  { $sort: { count: -1 }}
])

3.4 索引(Index)

支持多种:

  • 单字段
  • 复合索引
  • 唯一索引
  • 模糊索引用 Atlas Search(Lucene)
  • 地理空间索引
  • TTL 索引(自动过期)

3.5 复制集(Replica Set)

原生高可用机制。

  • Primary(主节点)
  • Secondary(从节点,支持延时)
  • Arbiter(判定者)

自动故障转移,无需人工干预。

3.6 Sharding(分片)

MongoDB 具备强大的水平扩展能力,可将集合分布到多个节点上:

组件:

  • config server(元数据)
  • router(mongos)
  • shard

分片策略:

  • 哈希分片
  • 范围分片

适合 PB 级别的数据量。

3.7 事务(Transactions)【4.0+】

支持跨文档、跨集合、多文档 ACID 事务。

🧩 4. MongoDB 底层架构

4.1 WiredTiger 存储引擎

特点:

  • 文档级锁(高并发)
  • 压缩(snappy/zstd)
  • Checkpoint + WAL(Write Ahead Log)
  • 内存映射

4.2 内存模型

MongoDB 使用 RAM 作为热数据缓存。

WiredTiger Cache 默认:

50% of RAM

热数据几乎完全在内存中,因此读写非常快,但比 Redis 慢。

4.3 WAL 日志(Journal)

MongoDB 保障 crash-safe:

写操作流程:

写内存 -> 写 WAL -> flush

🧩 5. MongoDB 的优点总结

1. 数据模型灵活(无 schema)

适合快速迭代、频繁变更的数据结构。

2. 查询能力强

Aggregation Pipeline 类似 SQL 的 group/where/sort。

3. 高可用(Replica Set)

无需外部组件。

4. 水平扩展(Sharding)

原生支持,高扩展性。

5. 跨文档事务

满足强一致性场景。

6. 易于运维

天然支持副本、备份、快照等。

🧩 6. MongoDB 的缺点

❌ 1. 不擅长复杂 JOIN(虽然 lookup 可用,但性能较差)

适合文档结构良好的业务。

❌ 2. 内存依赖强

如果热点数据太大,会频繁走磁盘导致性能下降。

❌ 3. 分片集群运维难度较高

对于初学者或小团队,分片不如单节点+副本简单。

❌ 4. 较高的存储空间成本

尽管有压缩,但文档结构冗余。

🧩 7. MongoDB 适用场景

🔥 1. 社交平台

  • 用户资料
  • 动态流
  • 评论
  • 点赞

符合文档嵌套、多端写入场景。

🔥 2. 电商

  • 商品列表(属性可能不同)
  • 订单记录
  • 用户行为日志

🔥 3. 内容管理系统 CMS

Markdown 文档、文章、标签、元数据等结构不固定。

🔥 4. 日志系统、时序数据

比 ELK 更轻量,存储大规模日志适合。

🔥 5. IoT 数据

结构复杂、频繁变化、写入量大。

🔥 6. 游戏系统

道具、角色状态、实时数据。

🧩 8. MongoDB vs MySQL 对比(简化版)

特点 MongoDB MySQL / PostgreSQL
结构 文档型、无 schema 结构化、有 schema
扩展 优秀,原生分片 中等,需中间件
写性能
读性能 高(依赖内存)
ACID 事务支持(4.0+) 强支持
复杂查询 很强 更强(JOIN)
最佳场景 非结构化、海量数据 强一致性、复杂查询

🧩 9. MongoDB 最佳实践(重点)

1. 嵌套文档优于多表

减少 lookup。

2. 创建合适的索引

常查字段必须索引。

3. 控制文档体积(推荐 < 16KB)

避免巨大文档(最大 16MB)。

4. 避免过多集合(>10 万会影响元数据性能)

5. 写多读少 -> 多副本读写分离

6. 热点数据要放在内存容量以内

7. 使用 TTL 索引清理过期数据

🧩 10. 企业级架构模式

  • Redis + MongoDB(热点 + 大数据)
  • MongoDB 副本集(二节点 + 仲裁)
  • MongoDB Sharding(海量数据)
  • MongoDB + Kafka(日志/流式处理)