MongoDB 概念解析
MongoDB 概念解析
1. SQL 与 MongoDB 术语对比
下表展示了传统关系型数据库(如 MySQL)与 MongoDB 的核心术语对比:
SQL 术语 | MongoDB 术语 | 说明 |
---|---|---|
数据库(Database) | 数据库(Database) | 逻辑容器,存储数据的顶层单元。 |
表(Table) | 集合(Collection) | 表存储结构化数据(行和列),集合存储无模式的文档(BSON 格式)。 |
行(Row) | 文档(Document) | 一行数据对应一个文档,文档是键值对的集合,支持嵌套和动态字段。 |
列(Column) | 字段(Field) | 列是表的固定字段,字段是文档中的键值对,无需预定义结构。 |
主键(Primary Key) | _id 字段 |
主键唯一标识表中的一行,MongoDB 默认使用 _id 字段作为文档的唯一标识符(可自定义或自动生成 ObjectId)。 |
外键(Foreign Key) | 引用(Reference) | 外键关联其他表的主键,MongoDB 通过手动引用或嵌入文档实现关联(无内置外键约束)。 |
索引(Index) | 索引(Index) | 加速查询的机制,MongoDB 支持单字段、复合、文本、地理空间等索引类型。 |
事务(Transaction) | 多文档事务(Transaction) | SQL 支持跨表事务,MongoDB 4.0+ 支持多文档 ACID 事务(需在副本集或分片集群中配置)。 |
JOIN 操作 | 聚合管道($lookup) | SQL 使用 JOIN 关联多表数据,MongoDB 通过 $lookup 阶段在聚合管道中关联集合(或嵌入文档直接嵌套)。 |
2. MongoDB 核心术语列表与详细解释
2.1 基础概念
文档(Document)
- MongoDB 的最小数据单元,采用 BSON(Binary JSON) 格式存储。
- 示例:
1
2
3
4
5
6
7
8
9
10{
"_id": ObjectId("5f9d1b9b8c8e8d0001a1b1c1"),
"name": "Alice",
"age": 30,
"address": {
"city": "New York",
"zip": "10001"
},
"tags": ["developer", "mongodb"]
}
集合(Collection)
- 文档的逻辑分组,类似于 SQL 的表,但无需固定结构。
- 同一集合中文档的字段可以不同(动态模式)。
数据库(Database)
- 物理容器,包含多个集合。
- 一个 MongoDB 实例可承载多个数据库,每个数据库独立存储。
_id
字段- 每个文档的必填字段,作为唯一标识符。
- 默认值为
ObjectId
(12字节唯一值,包含时间戳、机器标识等),可自定义为其他类型(如 UUID)。
2.2 数据操作
CRUD 操作
- Create:
insertOne()
,insertMany()
,insert()
- Read:
find()
,findOne()
- Update:
updateOne()
,updateMany()
,replaceOne()
- Delete:
deleteOne()
,deleteMany()
- Create:
聚合管道(Aggregation Pipeline)
- 对文档进行多阶段处理(如过滤、分组、排序),支持复杂数据分析。
- 示例:统计每个城市的用户数量
1
2
3db.users.aggregate([
{ $group: { _id: "$address.city", count: { $sum: 1 } } }
]);
索引(Index)
- 加速查询的数据结构,常见类型包括:
- 单字段索引:基于单个字段。
- 复合索引:基于多个字段(如
{ name: 1, age: -1 }
)。 - 文本索引:支持全文搜索。
- 地理空间索引:支持位置查询(如
2dsphere
)。
- 加速查询的数据结构,常见类型包括:
2.3 架构与扩展
副本集(Replica Set)
- 由多个 MongoDB 实例组成的集群,提供高可用性。
- 角色:
- Primary:主节点,处理写操作。
- Secondary:从节点,复制主节点数据,提供读操作和故障转移。
分片(Sharding)
- 水平扩展机制,将数据分布到多个分片(Shard)中。
- 核心组件:
- Shard:存储实际数据的分片。
- Config Server:存储集群元数据。
- Query Router(mongos):路由查询请求到对应分片。
分片键(Shard Key)
- 决定数据如何分布到分片的字段(如
user_id
或timestamp
)。 - 选择策略:需保证数据均匀分布,避免热点问题。
- 决定数据如何分布到分片的字段(如
2.4 高级概念
BSON(Binary JSON)
- MongoDB 的二进制数据格式,支持 JSON 的所有类型(如日期、二进制数据),并扩展了如
ObjectId
、Decimal128
等类型。
- MongoDB 的二进制数据格式,支持 JSON 的所有类型(如日期、二进制数据),并扩展了如
GridFS
- 存储和检索大文件(超过 16MB)的规范,将文件分块存储为多个文档。
Change Stream
- 监听数据库变更的 API(如文档插入、更新),用于实时数据处理。
物化视图(Materialized View)
- 通过聚合管道预计算并缓存结果,提升复杂查询性能。
3. MongoDB 与 SQL 的差异总结
特性 | SQL(关系型数据库) | MongoDB(文档数据库) |
---|---|---|
数据模型 | 严格的结构化表(行和列) | 灵活的文档(嵌套、动态字段) |
扩展性 | 垂直扩展(增强单机性能) | 水平扩展(分片集群) |
事务 | 原生支持多表复杂事务 | 4.0+ 支持多文档事务,但需谨慎使用 |
关联查询 | 通过 JOIN 实现 | 通过 $lookup 或应用层代码模拟 |
适用场景 | 强一致性、复杂事务(如金融系统) | 快速迭代、高吞吐、半结构化数据(如日志、IoT) |
总结
MongoDB 的术语体系围绕其 文档模型 和 分布式架构 设计,理解这些概念是高效使用 MongoDB 的关键。与传统 SQL 相比,MongoDB 更适合处理 动态模式、高并发读写和水平扩展 的场景,但在复杂事务和关联查询上需结合业务需求权衡。
MongoDB 概念解析
https://blog.qingyi-studio.top/2025/04/08/MongoDB概念解析/