前言
本系列文章旨在学习MongoDB权威指南的同时进行精炼总结,方便同样想要更深入学习MongoDB的同好朋友们预习回顾或是通过本文学习mongoDB权威指南精炼知识。
易于使用
MongoDB不是关系数据库,而是面向文档的数据库,MongoDB里没有表,而是集合。
集合中也没有行,而是文档,文档就是一个个JSON数据。
MongoDB也没有预定义模式,文档键值的类型和大小是不固定的,你可以按需添加或删除字段。
易于扩展
现在的数据规模越来越大,而扩展数据库又归结为两个方向
- 纵向扩展(提高配置)
- 横向扩展(将数据分布到更多机器上,我们称之为加机器doge)
MongoDB的设计采用了横向扩展,面向文档的数据模型使跨机器拆分数据更容易。MongoDB 会自动平衡跨集群的数据和负载,自动重新分配文档,并将读写操作路由到正确的机器上。
MongoDB 集群的拓扑结构对应用程序来说都是透明的。这使得开发人员能够专注于应用程序的开发,而无须考虑扩展问题。同样,如需扩展现有部署的拓扑结构以支持更多负载,那么也无须更改应用程序的逻辑。
功能丰富
索引
MongoDB 支持通用的二级索引,并提供唯一索引、复合索引、地理空间索引及全文索引功能。此外,它还支持在不同层次结构(如嵌套文档和数组)上建立二级索引,让开发人员能够以最适合应用程序的方式充分利用其建模能力。
聚合
MongoDB 提供了一种基于数据处理管道的聚合框架。用户可以通过在服务器端使用一系列相对简单的处理阶段,来充分利用数据库优化以构建复杂的分析引擎。
特殊的集合和索引类型
MongoDB 支持生命周期有限(TTL)集合,适用于保存将在特定时间过期的数据,比如会话和固定大小的集合,以及用于保存最近的数据(日志)。MongoDB 还支持部分索引,可以仅对符合某个条件的文档创建索引,以提高效率并减少所需的存储空间。
文件存储
针对大文件及文件元数据的存储,MongoDB 使用了一种非常易用的协议。
缺陷
MongoDB 并不具备关系数据库中的一些常见功能,特别是复杂的连接操作。MongoDB 通过使用 3.2 版本引入的 $lookup 聚合运算符以非常有限的方式支持连接操作。在 3.6 版本中,可以使用多个连接条件以及非关联子查询来实现更复杂的连接。MongoDB 的这种处理是出于架构上的考虑,以便获得更好的可扩展性,因为这些特性在分布式系统中很难高效地实现。
性能卓越
性能是 MongoDB 的重中之重,这一点决定了它的许多设计。它在其 WiredTiger 存储引擎中使用了机会锁,以最大限度地提高并发和吞吐量。它会使用尽可能多的RAM(内存)作为缓存,并尝试为查询自动选择正确的索引。
总之,MongoDB 的每个方面都是为了保持高性能而设计的。尽管 MongoDB 功能强大并且融合了关系数据库的许多特性,但它的设计初衷并不是具备关系数据库的所有功能。对于某些功能,数据库服务器会将处理和逻辑交给客户端(由驱动程序或用户的应用程序代码处理)。这种新型的设计方式是MongoDB 能够实现如此高性能的原因之一。
为了性能,牺牲了很多。
设计理念
MongoDB的主要设计目标是创建一个功能齐全、可扩展、灵活且快速的数据存储。
总结
第一章为介绍,介绍MongoDB的各个特性及缺点,后续各章会详细介绍及使用MongoDB。