MongoDB简介
MongoDB 简介:面向文档的分布式数据库
MongoDB 是一款高性能、开源、面向文档的 NoSQL 数据库,由 C++ 编写,专为处理海量非结构化或半结构化数据设计。它打破了传统关系型数据库的表结构限制,采用灵活的文档模型,非常适合 Web 应用、大数据存储和快速迭代的业务场景。
核心特性
面向文档的存储模型
文档(Document):MongoDB 的基本数据单元,类似 JSON 格式的BSON(Binary JSON),支持嵌套结构、数组等复杂数据类型。
示例文档:
{ "_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
{ "name": "Alice", "age": 25, "email": "alice@example.com" }
// 文档2(字段不同)
{ "name": "Bob", "phone": "123456789", "address": { "city": "Beijing" } }
高性能
- 内存映射(MMAP):通过内存映射文件(MMAP)技术将数据文件直接映射到进程内存,读写操作通过内存完成,减少传统 I/O 开销。
- 索引支持:支持单字段索引、复合索引、地理空间索引等,加速查询(类似关系型数据库的索引)。
- 读写分离:支持副本集(Replica Set),主节点处理写操作,从节点分担读压力,提高吞吐量。
高可用性与扩展性
- 副本集(Replica Set):由多个节点组成的集群,自动实现故障转移(主节点故障时,从节点自动选举新主节点),确保数据不丢失。
- 分片(Sharding):将海量数据分散存储到多个分片服务器,支持水平扩展,应对数据量增长。
丰富的查询与聚合能力
支持类似 SQL 的查询语法,包括过滤、排序、分页、嵌套查询等。
提供强大的聚合框架(Aggregation Pipeline),支持数据分组、统计、转换等复杂操作。
示例查询:
// 查询 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 |
| 适用场景 | 非结构化数据、高并发、快速迭代 | 结构化数据、强事务需求 |