MongoDB 是什么?
MongoDB是一种流行的面向文档的NoSQL数据库管理系统。它是一个开源的跨平台数据库,旨在为开发人员提供灵活性、扩展性和性能。MongoDB采用了面向文档的数据模型,它使用JSON风格的文档来存储数据,这些文档可以包含各种类型的数据,包括嵌套文档和数组。MongoDB的特点包括:
-
面向文档的数据模型:MongoDB使用类似JSON的文档来存储数据,这种文档格式具有灵活性,可以轻松地表示复杂的数据结构。
-
灵活性和可扩展性:MongoDB支持水平扩展,可以通过增加更多的服务器来处理更大的数据集和更高的负载。
-
高性能:MongoDB具有高性能的特点,能够处理大量的并发请求,并且具有快速的读写能力。
-
丰富的查询功能:MongoDB支持丰富的查询功能,包括索引、聚合、地理空间查询等,可以满足各种查询需求。
-
高可用性和容错性:MongoDB具有内置的复制和故障恢复功能,可以确保数据的高可用性和容错性。
-
开源和社区支持:MongoDB是开源的,并且拥有一个活跃的社区,提供了丰富的文档、教程和支持资源。
MongoDB 的存储结构是什么?
MongoDB 的存储结构区别于传统的关系型数据库,主要由如下三个单元组成:
- 文档(Document) :MongoDB 中最基本的单元,由 BSON 键值对(key-value)组成,类似于关系型数据库中的行(Row)。
- 集合(Collection) :一个集合可以包含多个文档,类似于关系型数据库中的表(Table)。
- 数据库(Database) :一个数据库中可以包含多个集合,可以在 MongoDB 中创建多个数据库,类似于关系型数据库中的数据库(Database)。
也就是说,MongoDB 将数据记录存储为文档 (更具体来说是BSON 文档),这些文档在集合中聚集在一起,数据库中存储一个或多个文档集合。
SQL 与 MongoDB 常见术语对比 :
SQL | MongoDB |
---|---|
表(Table) | 集合(Collection) |
行(Row) | 文档(Document) |
列(Col) | 字段(Field) |
主键(Primary Key) | 对象 ID(Objectid) |
索引(Index) | 索引(Index) |
嵌套表(Embeded Table) | 嵌入式文档(Embeded Document) |
数组(Array) | 数组(Array) |
从对比中我们可以看出MongoDB 中的记录就是一个 BSON 文档,它是由键值对组成的数据结构,类似于 JSON 对象,是 MongoDB 中的基本数据单元。字段的值可能包括其他文档、数组和文档数组。
MongoDB 有什么特点?
-
面向文档的数据模型:MongoDB采用面向文档的数据模型,使用类似JSON的BSON格式来存储数据。这种数据模型非常灵活,可以轻松地表示复杂的数据结构,而且不需要事先定义数据模式。
-
灵活性和可扩展性:MongoDB具有良好的扩展性,支持水平扩展,可以通过添加更多的服务器来处理更大的数据集和更高的负载。它还支持自动分片,可以将数据分布在集群中的多个节点上。
-
高性能:MongoDB具有高性能的特点,能够处理大量的并发请求,并且具有快速的读写能力。它还支持在内存中执行查询,从而提高了查询性能。
-
丰富的查询功能:MongoDB支持丰富的查询功能,包括索引、聚合管道、地理空间查询等。它还支持全文搜索和文本索引,可以满足各种查询需求。
-
高可用性和容错性:MongoDB具有内置的复制和故障恢复功能,可以确保数据的高可用性和容错性。它还支持自动故障转移和数据恢复,以及自动节点监控和管理。
-
安全性:MongoDB提供了各种安全功能,包括访问控制、身份验证、数据加密和审计日志等。它还支持各种安全认证机制,包括用户名/密码认证、TLS/SSL认证等。
MongoDB 适合什么应用场景?
-
大数据量和高并发的应用:MongoDB具有优秀的性能和可扩展性,适合处理大数据量和高并发的应用场景,如社交网络、电子商务网站和在线游戏等。
-
需要灵活的数据模型:MongoDB的面向文档的数据模型非常灵活,可以轻松地表示复杂的数据结构,适合处理数据模型频繁变化或者没有固定模式的应用场景。
-
需要快速迭代和开发的项目:由于MongoDB不需要事先定义数据模式,因此可以更快地进行开发和迭代,适合需要快速响应市场变化的项目。
-
需要实时分析和查询的应用:MongoDB支持丰富的查询功能,包括索引、聚合管道、地理空间查询等,可以满足实时分析和查询的需求,如实时监控、日志分析和智能推荐等。
-
需要高可用性和容错性的项目:MongoDB具有内置的复制和故障恢复功能,可以确保数据的高可用性和容错性,适合需要24/7运行的关键业务应用。
-
需要与其他系统集成的项目:MongoDB拥有一个强大的生态系统,包括各种工具和驱动程序,可以与其他系统集成,如Hadoop、Spark和Kafka等。
MongoDB 事务
MongoDB 从版本4.0开始支持多文档事务,这为开发人员提供了在多个文档上执行原子操作的能力。在MongoDB中,事务可用于以下情况:
-
多文档操作:当需要在多个文档上执行原子操作时,可以使用事务。例如,如果你需要在一个订单文档中更新订单状态,并且在相应的库存文档中更新库存数量,你可以使用事务确保这两个操作要么同时成功,要么同时失败。
-
跨集合操作:在同一数据库中,你可以在不同的集合之间执行事务操作。这使得你可以跨集合执行原子操作,而无需担心数据一致性问题。
-
复杂操作的原子性:当需要执行复杂的操作,需要确保这些操作要么全部成功,要么全部失败时,可以使用事务。例如,在某个文档上执行一系列更新操作,你希望这些更新要么全部成功,要么全部失败,你可以将这些操作包装在一个事务中。
使用MongoDB事务时需要注意以下几点:
- 事务操作必须要在支持事务的副本集中进行,不支持在分片集群中进行事务操作。
- MongoDB事务遵循读写一致性,这意味着在一个事务中,如果对某个文档进行了写操作,后续的读操作将会读取到该写操作所修改后的值。
- MongoDB事务采用悲观锁机制,即事务在执行期间会锁定涉及的文档,直到事务提交或回滚才会释放锁。
- 事务的最大执行时间是60秒,如果一个事务在60秒内没有执行完毕,MongoDB会自动回滚该事务。
MongoDB 支持哪些类型的索引?
MongoDB 支持多种类型的索引,包括单字段索引、复合索引、多键索引、哈希索引、文本索引、 地理位置索引等,每种类型的索引有不同的使用场合。
- 单字段索引: 建立在单个字段上的索引,索引创建的排序顺序无所谓,MongoDB 可以头/尾开始遍历。
- 复合索引: 建立在多个字段上的索引,也可以称之为组合索引、联合索引。
- 多键索引 :MongoDB 的一个字段可能是数组,在对这种字段创建索引时,就是多键索引。MongoDB 会为数组的每个值创建索引。就是说你可以按照数组里面的值做条件来查询,这个时候依然会走索引。
- 哈希索引 :按数据的哈希值索引,用在哈希分片集群上。
- 文本索引: 支持对字符串内容的文本搜索查询。文本索引可以包含任何值为字符串或字符串元素数组的字段。一个集合只能有一个文本搜索索引,但该索引可以覆盖多个字段。MongoDB 虽然支持全文索引,但是性能低下,暂时不建议使用。
- 地理位置索引: 基于经纬度的索引,适合 2D 和 3D 的位置查询。
- 唯一索引 :确保索引字段不会存储重复值。如果集合已经存在了违反索引的唯一约束的文档,则后台创建唯一索引会失败。
- TTL 索引 :TTL 索引提供了一个过期机制,允许为每一个文档设置一个过期时间,当一个文档达到预设的过期时间之后就会被删除。