主题
MongoDB技术栈总览
一句话定位:MongoDB 是 C++ 写的、面向文档存储的分布式 NoSQL 数据库——用 BSON(二进制 JSON)文档取代表,用副本集(Replica Set)保证高可用、分片集群(Sharded Cluster)保证水平扩展;「功能最丰富、最像关系型」的 NoSQL,适合文档化、快速迭代、高伸缩场景。
NoSQL vs SQL(为什么选它)
| 维度 | SQL(关系型) | NoSQL(MongoDB) |
|---|---|---|
| 存储 | 表、行、列(结构化) | 文档/键值/图(BSON 动态结构) |
| 结构 | 预定义 schema,改结构难 | 模式自由,随需求演进 |
| 扩展 | 纵向扩展(升配) | 横向扩展(加节点) |
| 查询 | SQL 标准 | UnQl(非标准,类似面向对象) |
| 事务 | ACID | BASE(基本可用/软状态/最终一致) |
| 代表 | MySQL / PostgreSQL / Oracle | MongoDB / Redis / HBase |
选型口诀(7 问任一 Yes 考虑 MongoDB,≥2 个 Yes 就选它):无事务/复杂 join · 需求易变想快速迭代 · 2000+ QPS · TB/PB 级数据 · 需快速水平扩展 · 数据不丢 · 99.999% 高可用 · 大量地理位置/文本查询。
核心概念(库 / 集合 / 文档)
| MongoDB | 关系型对照 | 说明 |
|---|---|---|
| database | database | 一个实例可容纳多个独立库(默认 db) |
| collection(集合) | table | 文档组,无固定结构 |
| document(文档) | row | 一组 BSON key-value,同集合文档字段可不一致 |
| field(字段) | column | 键值对的 key |
| namespace | — | 库名.集合名(如 db.user) |
- 进程:
mongod(服务端,默认端口 27017、数据目录 /data/db)、mongo(客户端 shell)、mongos(分片路由)。 - 命令:
use db(切库/建库)、show dbs(看库列表)。
数据结构(BSON)
BSON = Binary JSON,二进制序列化,支持内嵌文档与数组。常用类型:String / Integer / Boolean / Array / Date / Binary Data / Code(JS)/ Regular Expression。
索引
- 作用:避免全集合扫描(无索引时大集合查询几十秒)。
- 类型:单字段 / 复合 / 多键(数组)/ 全文 / Hash / 通配符。
- 特性:任何字段都可建索引;子文档索引顺序敏感(
A:{B,C}建的索引,A:{C,B}查不到)。
应用场景(为什么用它)
- 游戏:用户装备/积分内嵌文档存储。
- 物流:订单状态变更用内嵌数组,一次查询读全。
- 社交:用户信息 + 朋友圈 + 地理位置索引(附近的人)。
- 物联网:设备信息 + 日志多维分析。
- 视频直播:用户/礼物信息。
- 通用:网站实时数据、数据缓存层、对象/JSON 存储、高伸缩场景。
不适用:高度事务系统(银行/会计)、传统 BI、复杂 SQL 场景。
常见误解
- 以为 MongoDB 能当关系型用(强事务/join)→ 它无 ACID 事务、无 join,是 BASE 模型。
- 以为 MongoDB 内存存储 → 它持久化到磁盘(只是写延迟刷盘,默认 60s 内),不是纯内存库。
- 以为 NoSQL 就是"没有 SQL" → Not Only SQL,是"不只是 SQL"。
关联
- 副本集与分片:概念卡片:MongoDB副本集与分片集群
- 面试:面试题蒸馏卡:MongoDB
- 同类对比:概念卡片:消息队列对比(选型思路)· MySQL技术栈总览 / Redis技术栈总览