MongoDB 简介:面向文档的分布式数据库
MongoDB 是一款高性能、开源、面向文档的 NoSQL 数据库,由 C++ 编写,专为处理海量非结构化或半结构化数据设计。它打破了传统关系型数据库的表结构限制,采用灵活的文档模型,非常适合 Web 应用、大数据存储和快速迭代的业务场景。
核心特性
面向文档的存储模型
文档(Document):MongoDB 的基本数据单元,类似 JSON 格式的BSON(Binary JSON),支持嵌套结构、数组等复杂数据类型。
示例文档:
1
2
3
4
5
6
7
8
9
10
11{
"_id": ObjectId("507f1f77bcf86cd799439011"), // 自动生成的唯一标识
"name": "MongoDB",
"type": "database",
"features": ["high performance", "high availability", "easy scalability"],
"version": "6.0",
"metrics": {
"downloads": 1000000,
"users": 500000
}
}集合(Collection):多个文档的集合,类似关系型数据库的 “表”,但无需预先定义结构(模式自由),同一集合中的文档可以有不同的字段。
模式自由(Schema-less)
无需预先定义表结构(Schema),文档的字段可以动态添加或修改,适应业务快速迭代。
例如,同一users集合中可以同时存在以下文档:
1 | // 文档1 |
高性能
- 内存映射(MMAP):通过内存映射文件(MMAP)技术将数据文件直接映射到进程内存,读写操作通过内存完成,减少传统 I/O 开销。
- 索引支持:支持单字段索引、复合索引、地理空间索引等,加速查询(类似关系型数据库的索引)。
- 读写分离:支持副本集(Replica Set),主节点处理写操作,从节点分担读压力,提高吞吐量。
高可用性与扩展性
- 副本集(Replica Set):由多个节点组成的集群,自动实现故障转移(主节点故障时,从节点自动选举新主节点),确保数据不丢失。
- 分片(Sharding):将海量数据分散存储到多个分片服务器,支持水平扩展,应对数据量增长。
丰富的查询与聚合能力
支持类似 SQL 的查询语法,包括过滤、排序、分页、嵌套查询等。
提供强大的聚合框架(Aggregation Pipeline),支持数据分组、统计、转换等复杂操作。
示例查询:
1
2// 查询 age > 18 且 country = "China" 的用户,按 name 升序排序
db.users.find({ age: { $gt: 18 }, country: "China" }).sort({ name: 1 })
多语言支持
- 提供官方驱动支持几乎所有主流编程语言,如 Java、Python、Node.js、C#、PHP 等,易于集成到各类应用中。
适用场景
MongoDB 适合处理以下类型的业务需求:
- 非结构化 / 半结构化数据:如日志、用户行为、社交数据(JSON 格式天然适配)。
- 快速迭代的业务:无需频繁修改表结构,适应敏捷开发。
- 高并发读写:通过副本集和分片支持高吞吐量。
- 大数据存储:分片机制支持 PB 级数据存储。
典型应用案例:
- 电商平台的商品信息(字段多变)。
- 社交应用的用户动态、消息记录。
- 物联网设备的传感器数据(海量、非结构化)。
与关系型数据库的核心区别
特性 | MongoDB(NoSQL) | 关系型数据库(如 MySQL) |
---|---|---|
数据模型 | 文档(BSON),嵌套结构 | 表(行 / 列),严格 Schema |
扩展性 | 水平扩展(分片)为主 | 垂直扩展(升级硬件)为主 |
事务支持 | 支持多文档事务(4.0+) | 强事务支持(ACID) |
join 操作 | 不支持(通过应用层实现关联) | 原生支持多表 join |
适用场景 | 非结构化数据、高并发、快速迭代 | 结构化数据、强事务需求 |
v1.3.10