- Published on
MongoDB
- Authors

- Name
- MissTree
安装
MongoDB 官网 MongoDB 安装就不再赘述,之前有实践说明过
核心特点
- 灵活的数据模型:MongoDB 使用灵活的文档模型来存储数据,每个文档可以包含不同的字段和数据类型,无需预先定义模式。
- 高性能:MongoDB 采用了内存映射文件(MMAP)的方式,将数据直接存储在内存中,提供快速的读写性能,支持索引、聚合管道和分片,能够高效处理大规模数据和高并发请求。
- 文档模型:MongoDB 使用 BSON(Binary JSON)格式存储数据,数据以文档的形式组织,类似于 JSON 对象。每个文档可以包含嵌套的结构,支持数组和子文档。
- 高可用性:通过副本集(Replica Set)实现数据冗余和自动故障转移。
- 水平扩展:通过分片(Sharding)支持数据的分布式存储,适合处理海量数据。
- 丰富的查询语言:支持复杂的查询、聚合操作和地理空间查询。
- 多语言支持:提供多种编程语言的驱动程序(如 Python、Java、Node.js 等)
核心概念
- 文档(Document):MongoDB 中的数据以文档的形式存储,类似于 JSON 对象。每个文档可以包含不同的字段和数据类型。
{ "_id": ObjectId("64b8f1a2e4b0a1a2b3c4d5e6"), "name": "Alice", "age": 25, "address": { "city": "New York", "zip": "10001" }, "hobbies": ["reading", "traveling"] } - 集合(Collection):类似于关系型数据库中的表,用于存储具有相似结构的文档。
- 类似于关系型数据库中的表,用于存储文档。
- 集合是无模式的,文档结构可以不同。
- 数据库(Database):
- 多个集合的容器,每个 MongoDB 实例可以包含多个数据库。
- _id 字段:
- 每个文档都有一个唯一的 _id 字段,作为主键。如果没有提供,MongoDB 会自动生成一个 ObjectId。
数据模型
MongoDB 采用了灵活的文档模型来存储数据,每个文档可以包含不同的字段和数据类型,无需预先定义模式。这使得 MongoDB 非常适合处理半结构化和非结构化数据。
- 文档模型:MongoDB 使用 BSON(Binary JSON)格式存储数据,数据以文档的形式组织,类似于 JSON 对象。每个文档可以包含嵌套的结构,支持数组和子文档。
MongoDB 的文档模型非常灵活,支持以下特性:
- 嵌套文档:文档中可以包含子文档。
- 数组:文档中可以存储数组。
- 动态字段:文档的字段可以动态添加或删除。
{
"name": "Bob",
"age": 30,
"contact": {
"email": "bob@example.com",
"phone": "123-456-7890"
},
"skills": ["MongoDB", "Node.js", "JavaScript"]
}
查询语言
MongoDB 提供了丰富的查询语言,支持复杂的查询、聚合操作和地理空间查询。
- 基本查询:使用查询操作符(如 gt、$lt 等)进行基本查询。
- 高级查询:使用聚合管道(Aggregation Pipeline)进行复杂的查询和分析。
- 地理空间查询:支持地理空间查询,如地理位置查询、距离查询等。
// 基本查询
db.collection.find({ "age": 30 })
// 投影 返回 name 和 age 字段
db.collection.find({ "age": { $gt: 30 } })
// 聚合查询
db.orders.aggregate([
{ $match: { status: "completed" } },
{ $group: { _id: "$customer", total: { $sum: "$amount" } } }
]);
//支持单字段索引、复合索引、全文索引和地理空间索引。
db.users.createIndex({ age: 1 }); // 创建升序索引
高可用性与扩展性
- 副本集(Replica Set):
- 副本集是 MongoDB 的高可用性解决方案,主节点负责写操作,从节点负责读操作和数据冗余。
- 副本集由多个节点组成,其中一个节点为主节点(Primary),其他节点为从节点(Secondary)。
- 主节点负责处理写操作,从节点负责处理读操作。
- 分片(Sharding):
- 分片是 MongoDB 的水平扩展解决方案,将数据分散存储在多个节点上,实现数据的分布式存储,通过分片键(Shard Key)决定数据分布。。
- 每个分片都是一个独立的 MongoDB 实例,可以独立进行读写操作。
- 分片集群由多个分片节点组成,每个分片节点负责存储一部分数据,适合处理海量数据和高并发场景。
适用场景
MongoDB 适用于以下场景:
- 内容管理系统(CMS):灵活的模式适合存储多变的文档数据。
- 实时分析:高效的查询和聚合操作适合实时数据分析。
- 物联网(IoT):支持时间序列数据和高吞吐量写入。
- 社交网络:嵌套文档和数组适合存储复杂的用户关系和数据,存储用户生成的内容和社交关系。
- 移动应用:支持地理位置查询和地理位置索引。
- 缓存层:可以作为缓存数据库,替代 Redis 或 Memcached。
- 企业应用:支持复杂的查询和事务处理。
优缺点
- 优点:
- 灵活的数据模型:MongoDB 采用灵活的文档模型,支持嵌套文档和数组,适合处理半结构化和非结构化数据。
- 高性能:MongoDB 采用内存映射文件(MMAP)的方式,将数据直接存储在内存中,提供快速的读写性能。
- 高可用性:通过副本集实现数据冗余和自动故障转移。 -丰富的生态系统和社区支持。
- 缺点:
数据一致性:由于数据模型的灵活性,可能会导致数据一致性问题。
不支持复杂的事务处理:MongoDB 不支持复杂的事务处理,需要借助其他工具或解决方案。
内存占用较高,适合大内存服务器。
不支持事务(早期版本,4.0 以后支持多文档事务)。
不支持 ACID 事务。
总结
MongoDB 是一个功能强大且灵活的文档型数据库,适合处理半结构化和非结构化数据。它的高性能、高可用性和易扩展性使其成为现代应用开发的热门选择。无论是小型项目还是大规模分布式系统,MongoDB 都能提供出色的支持。