MongoDB 基础教程
MongoDB 详细介绍:核心概念 + 底层原理 + 应用场景 + 最佳实践),偏工程化、架构化
MongoDB 是一个 文档型 NoSQL 数据库,使用 BSON(二进制 JSON)存储数据,具有:
- 无模式 Schema-less
- 水平扩展能力强(Sharding)
- 高性能读写
- 原生复制集高可用(Replica Set)
- 丰富查询能力(聚合管道、索引等)
- 支持多文档事务(4.0+)
它非常适合存储 非结构化、半结构化、大规模、高并发数据。
MongoDB 基本单位,相当于关系数据库里的“行”。
示例文档(BSON -> JSON 示例):
{
"_id": "647fa0b1",
"name": "martin",
"age": 28,
"tags": ["IT", "photography"],
"profile": {
"city": "NY",
"followers": 12000
}
}
特点:
- 字段灵活,可嵌套文档、数组。
- 不需要统一 schema。
类似关系数据库的“表”,但无固定字段结构。
和传统概念一致,用于组织集合。
高性能二进制格式,支持 JSON 不支持的数据类型,如:
- Date
- Binary
- Decimal128
- ObjectId
每个文档必须有 _id(唯一索引)。
默认使用 ObjectId(12 字节、可排序)。
- 文档为基本单元 -> 少 JOIN -> 快
- WiredTiger 存储引擎 -> 压缩 + 行级并发控制(文档级锁)
- 内存缓存(存储引擎 cache)大幅减少磁盘 IO
- 无固定 schema
- 支持嵌套结构
- 适合快速迭代的业务(社交、电商、IoT)
包括:
- 字段筛选
- 范围查询
- 索引支持(B-tree)
- 数组匹配
- 地理位置查询
- Aggregation Pipeline(强大的数据分析能力)
示例:
db.users.aggregate([
{ $match: { city: "NY" }},
{ $group: { _id: "$gender", count: { $sum: 1 } }},
{ $sort: { count: -1 }}
])
支持多种:
- 单字段
- 复合索引
- 唯一索引
- 模糊索引用 Atlas Search(Lucene)
- 地理空间索引
- TTL 索引(自动过期)
原生高可用机制。
- Primary(主节点)
- Secondary(从节点,支持延时)
- Arbiter(判定者)
自动故障转移,无需人工干预。
MongoDB 具备强大的水平扩展能力,可将集合分布到多个节点上:
组件:
- config server(元数据)
- router(mongos)
- shard
分片策略:
- 哈希分片
- 范围分片
适合 PB 级别的数据量。
支持跨文档、跨集合、多文档 ACID 事务。
特点:
- 文档级锁(高并发)
- 压缩(snappy/zstd)
- Checkpoint + WAL(Write Ahead Log)
- 内存映射
MongoDB 使用 RAM 作为热数据缓存。
WiredTiger Cache 默认:
50% of RAM
热数据几乎完全在内存中,因此读写非常快,但比 Redis 慢。
MongoDB 保障 crash-safe:
写操作流程:
写内存 -> 写 WAL -> flush
适合快速迭代、频繁变更的数据结构。
Aggregation Pipeline 类似 SQL 的 group/where/sort。
无需外部组件。
原生支持,高扩展性。
满足强一致性场景。
天然支持副本、备份、快照等。
适合文档结构良好的业务。
如果热点数据太大,会频繁走磁盘导致性能下降。
对于初学者或小团队,分片不如单节点+副本简单。
尽管有压缩,但文档结构冗余。
- 用户资料
- 动态流
- 评论
- 点赞
符合文档嵌套、多端写入场景。
- 商品列表(属性可能不同)
- 订单记录
- 用户行为日志
Markdown 文档、文章、标签、元数据等结构不固定。
比 ELK 更轻量,存储大规模日志适合。
结构复杂、频繁变化、写入量大。
道具、角色状态、实时数据。
| 特点 | MongoDB | MySQL / PostgreSQL |
|---|---|---|
| 结构 | 文档型、无 schema | 结构化、有 schema |
| 扩展 | 优秀,原生分片 | 中等,需中间件 |
| 写性能 | 高 | 高 |
| 读性能 | 高(依赖内存) | 高 |
| ACID | 事务支持(4.0+) | 强支持 |
| 复杂查询 | 很强 | 更强(JOIN) |
| 最佳场景 | 非结构化、海量数据 | 强一致性、复杂查询 |
减少 lookup。
常查字段必须索引。
避免巨大文档(最大 16MB)。
- Redis + MongoDB(热点 + 大数据)
- MongoDB 副本集(二节点 + 仲裁)
- MongoDB Sharding(海量数据)
- MongoDB + Kafka(日志/流式处理)