MongoDB是目前非常流行的文档数据库之一,它既能够作为完全托管的云服务来使用,也可以部署到私有服务器上自行维护。它的出现使数据的存储、获取和分析领域带来了里程碑式的变革。对于当今的互联网从业者来说,了解并能够灵活使用MongoDB非常重要。
1、MongoDB概述
随着大数据时代的到来,数据呈爆炸式增长,这使得传统的关系数据库面临越来越大的挑战。高性能、可扩展的数据库变得越来越重要。在这样的场景下,非关系数据库应运而生,并且越来越受到欢迎。MongoDB便是非关系数据库的典型代表。MongoDB是一个介于关系数据库与非关系数据库之间的产品,是非关系数据库中功能最丰富、最像关系数据库的NoSQL数据库。
MongoDB是一款为Web应用和互联网基础设施设计的数据库管理系统。它使用C++语言编写,是一个可扩展、开源、表结构自由的数据库,旨在为Web应用提供可扩展的高性能数据存储解决方案。它支持的数据格式是BSON,一种类似于JSON的二进制形式的存储格式,即BinaryJSON,这种格式与JSON一样能够支持内嵌的文档对象和数组对象。
MongoDB的官网上写着这样一句话:“Loved bydevelopers, trusted by enterprises(被开发者所钟爱,被企业所信任)”。MongoDB凭借其出色的数据存储功能,已成为当前非关系数据库领域的佼佼者。根据DB-Engines网站目前最新的统计(2024年11月),前20个数据库各项指标的排名如图所示。可以看到,MongoDB在数据库领域总排名第5,仅次于Oracle、MySQL等关系数据库,在NoSQL数据库领域排名首位。

综合MongoDB官网提供的信息、权威机构的评价以及开发者总结的博客,可以大概整理出MongoDB属性的相关信息,如表所示。表中描述的概念或属性会在后面进行讲解。

此外,MongoDB作为开源项目,对开发者的支持非常友好。MongoDB官方提供了众多学习及解决问题的途径,包括官方的API文档、开发者中心、社区以及MongoDB学校。这些途径使得开发者在资料搜集以及问题解决方面节省了非常多的时间,并且能够得到非常权威的解答。MongoDB官方提供的资源地址如表所示。

MongoDB还公布了有史以来所有BUG的报告,使用者可以跟踪BUG列表查看所有的问题记录,有针对性地选择适用自己的版本,避开缺陷。
不仅如此,MongoDB还为完善及开发MongoDB数据库服务端的开发者提供了交流论坛:https://community.mongodb.com/c/server-dev。
从目前的市场占有量来看,MongoDB的应用已经渗透到各个领域。以下是一些主要的应用场景。
内容管理:MongoDB可以用于存储网站的文章、博客、图片、视频等内容。例如,一个新闻网站可以使用MongoDB来存储新闻文章、评论等内容,每篇文章及其相关的内容作为一个文档,这样可以轻松地扩展以处理大量的新闻和媒体数据。社交网络:MongoDB可以用于存储社交网络用户的信息、帖子、评论等数据。例如,一个社交媒体平台可以使用MongoDB存储用户发表的帖子、评论等数据,由于MongoDB支持嵌套文档,可以将用户的活动流存储在其个人资料文档中,一次查询即得所有,使得实时推送和社交互动更高效。物流信息:使用MongoDB存储订单信息,在订单状态转变的过程中,同时存储订单的流转信息,这样使用时就可以快速获得订单相关的所有信息。物联网:MongoDB可以用于存储物联网设备的数据,如智能设备信息、传感器数据、位置信息等。例如,IoT(Internet of Things,物联网)设备可以生成大量数据,如温度、湿度、位置、流量等,同时可以存储设备汇报的日志信息,MongoDB可以将这些数据用于分析,从而达到监控设备状态、执行预测维护以及生成分析报告的目的。游戏:MongoDB可以用于存储游戏用户的数据,如角色信息、装备信息、积分等。例如,在线游戏需要快速更新和响应用户的操作,MongoDB可以用于存储用户配置、游戏状态等数据,以实现实时互动。地理空间数据:地图应用程序和位置服务可以使用MongoDB来存储地理空间数据,如地点、地区边界和路线。这些数据可以用于位置搜索、导航和地理信息分析。大数据处理:MongoDB可以用于存储大数据并提供灵活的查询和分析能力,用于分析行业动态、用户习惯等。例如,一家电子商务公司可以使用MongoDB来存储销售数据、用户行为和产品信息,通过MongoDB的聚合功能可以实时分析销售趋势、用户偏好和库存情况。日志和事件存储:大型服务器集群运行过程中会生成大量的日志和事件数据,MongoDB可以用于存储和检索这些数据以进行系统监控、性能分析和故障排除。
2、MongoDB的发展历史
MongoDB自诞生至今已有16年的历史。2007年,10gen公司在开发一个PaaS项目时,设计了一款新的数据库技术。该技术旨在解决传统关系数据库在云计算环境中难以管理的问题,以实现Web应用的托管和自动扩展。开发者对这项新的数据库技术表现出极大的兴趣,因此10gen公司决定将更多精力投入该数据库的研发中,从而促成了MongoDB的诞生。经过一段时间的研发和测试,MongoDB于2009年正式发布,并推出了MongoDB 1.0版本。此后,MongoDB进入了一个快速发展的阶段。在最初的短短6年时间里,MongoDB取得了其他产品可能需要10年甚至20年才能达到的发展成果。
在接下来的几年中,MongoDB不断推出新的版本,逐步增加了许多功能和特性。2010年8月,MongoDB发布了1.6版本,引入了一些主要特性,如用于水平伸缩的分片、具备自动故障转移能力的副本集,以及对IPv6的支持。2012年5月23日,MongoDB发布了2.1版本,采用全新的架构,提供了诸多增强特性。
2012年8月,MongoDB发布了2.2版本,引入了聚合管道,可以将多个数据处理步骤组合成一个操作链。
2013年,MongoDB推出第一款商业版本MongoDBEnterprise Advanced。这一版本的推出不仅进一步巩固了MongoDB在开源数据库市场中的地位,还标志着MongoDB正式进入商业数据库市场。
此后,MongoDB不断推出新的版本,逐步完善数据库的功能和性能。发展至今,MongoDB已经迭代了7个大版本,几百个小版本,版本迭代时间线如图所示。

从设计之初,MongoDB便以开源形式向外公开,这也是 越来越多的人选择MongoDB并将其用于实际生产环境的主要原因。MongoDB源码在GitHub的地址为https://github.com/mongodb/mongo。在GitHub上,目前我们依然能够看到创始人之一Dwight在2007年10月第一次提交的MongoDB代码,如图所示。

在该开源项目上,我们可以看到MongoDB多达128个分支,每个分支对应特定的版本或功能特性。目前,一直在维护的分支对应版本4.2、4.4、5.0、6.0、7.0、7.1以及其他一些特定功能的分支,如图所示。

目前还在维护的部分版本特性如表所示。

MongoDB的版本号命名分为两个阶段:5.0之前的版本和5.0(含)之后的版本。在5.0之前的版本,例如4.4及更早的版本,MongoDB采用的是生产/开发版本控制机制。版本号的格式为X.Y.Z,其中X.Y表示发行版本序列号或开发版本序列号,Z表示补丁号或修订号,即对之前版本中发现的漏洞进行修复的补丁。例如,版本号4.4.7中的4.4是发行版本序列号,而7是该发行版本的修订号。
- 如果Y是偶数,则X.Y是发行版本序列号。例如,4.0、4.2是一个发行版本序列号。发行版本通常比较稳定,可用于生产环境。
- 如果Y是奇数,则X.Y是开发版本序列号。例如,4.1、4.3是一个开发版本序列号。开发版本应该仅用于测试,不能用于生产环境。
因此,在图2所示的发布时间线中只能看到4.0、4.2、4.4版本。
通常发行版本序列号的改变(如4.0变成4.2)标志着引入了新的特性,这些新特性通常无法向后兼容。补丁(修订号)发布的改变(例如4.0.12到4.0.14)通常标志着BUG的修复,并且可以向后兼容。
从MongoDB 5.0开始,版本号的前两个数字位(X.Y)表示的意义发生了变化,并且开始分为两个不同的发布系列:
主版本(Major Releases)和快速发布版本(RapidReleases)。除此之外,还有补丁发布版本(PatchReleases)、候选发布版本(Release Candidates)。其中补丁发布版本的版本号与之前的版本号格式相同。
- 主版本:例如5.0、6.0、7.0、8.0。
- 快速发布版本:例如5.1、5.2。
- 补丁发布版本:例如5.0.1、5.2.1。
- 候选发布版本:例如5.0.0-rc0。
主版本大约每年发布一次,会引入一些新特性和改进。主版本支持MongoDB Atlas(云平台)和本地部署。目前(到2025年年初)MongoDB最新的稳定版本为8.0。
快速发布版本大约每个季度发布一次,也会引入一些新特性和改进。快速发布版本仅在MongoDB Atlas中支持, 不支持本地部署。同时,快速发布版本不适用于部署工具MongoDB Ops Manager。
补丁发布版本是根据主版本和快速发布版本的需要来发布的,通常包括BUG修复和小的改进。例如:
5.0.1 (主版本的补丁版本)
5.2.1 (快速发布版本的补丁版本)
在新的主版本和快速发布版发布之前,候选发布版本可用于早期测试。候选发布版本代表即将发布的版本,该版本足够稳定,可以用于测试,但不适合生产部署。
例如:
5.0.0-rc0
5.0.0-rc1
5.1.2-rc5
关于版本部分,MongoDB官方有一句重要提示,始终升级到所使用的发布系列的最新稳定补丁发布版。也就是说,如果使用的是4.x版本,那么始终要保持更新到4.x对应的最新的稳定的补丁版本。
3、MongoDB的优缺点
1.3、MongoDB的优点
MongoDB拥有诸多优点,涉及多个方面。
1)模式自由
MongoDB放弃了复杂的关系模型,转而采用对象模型,并采用文档存储形式。这种存储方式易于存储、易于查询且效率高,非常适合敏捷式的快速开发。与关系数据库不同,MongoDB的文档无须预先定义Schema。在关系数据库中,每张表都有严格定义的Schema,规定了列和类型,这种模式使得扩展变得非常困难,有时甚至会因为一小部分数据的变更而需要修改整个表结构。
在MongoDB中,同一个集合可以包含具有不同字段(类型)的文档对象,并且支持使用JSON Schema来规范数据模式。理论上,集合中的每个文档都可以拥有完全不同的结构。但在实践中,一个集合中的文档通常相对统一。例如,在一个订单集合中,每个文档通常都包含订单号、商品内容、创建时间、购买人、价格等字段。
MongoDB在保证模式的灵活性和动态性的同时,还提供了强大的数据治理能力。
2)动态查询
MongoDB支持动态查询,查询语言丰富,能够满足大多数应用的需求,并且支持丰富的查询语法和灵活的条件查询,包括范围查询、正则表达式、地理空间查询等。这使得开发人员可以轻松地构建复杂的查询来满足各种需求。
3)可扩展性
MongoDB被用在一些规模庞大的环境中,FourSquare和Craigslist网站都在使用它。通过分片技术,MongoDB能够实现数据的水平扩展,以应对大规模数据的存储和高并发访问。如此优秀的扩展能力,使得它能够快速响应业务变化。
4)复制和故障修复
MongoDB支持复制功能,可以在多个服务器之间复制数据。虽然这是一种数据冗余的存储方式,但是可以提高数据的安全性、可用性和可靠性。同时,MongoDB还支持故障恢复功能。例如,当主节点出现故障时,系统可以自动切换到从节点,以保证数据库的可用性、完整性和可靠性。
5)支持多种存储引擎
MongoDB支持多种存储引擎,如WiredTiger、MMAPv1,这使得MongoDB能够适应不同的应用场景和需求。从MongoDB 3.2版本开始支持WiredTiger存储引擎。与此同时,WiredTiger成为MongoDB的默认存储引擎,不再使用MMAPv1作为默认存储引擎。WiredTiger存储引擎通过使用不同的数据结构,在兼顾磁盘I/O操作的同时,维持了获取数据的高速度。
除上述两种存储引擎外,MongoDB还提供了一个InMemory存储引擎。该引擎将数据仅存储在内存中,而将少量的元数据和诊断日志存储到硬盘文件中。由于无须进行磁盘I/O操作,使用InMemory存储引擎可以显著降低数据查询的延迟,从而快速获取所需的数据。然而,这种存储方式并不适合大规模数据存储,因为一旦服务器宕机,内存中的数据将会丢失。
6)支持多语言驱动程序
MongoDB支持多种语言的驱动程序,包括Java、Python、PHP、C#、JavaScript等,这使得开发者可以使用自己熟悉的编程语言来访问和使用MongoDB。
3.2、MongoDB的缺点
正如许多技术解决方案一样,MongoDB在提供强大功能的同时,也存在一些潜在的局限性。以下是MongoDB的一些主要缺点。
1)高存储空间消耗
MongoDB通常会占用更多的磁盘空间,因为它为每个文档存储键和其他一些元数据,同时在集合和数据库级别维护索引。
2)较高的内存消耗
MongoDB倾向于使用更多的内存来提供更高的性能,尤其是在索引和聚合操作中,这可能导致更高的内存消耗。
3)查询性能与复杂性
虽然MongoDB可以快速执行简单的查询,但对于复杂的查询和聚合操作,可能需要编写更复杂的聚合管道或使用MapReduce。这相比关系数据库的SQL查询,可能需要更多的开发工作。
4)数据一致性
MongoDB是一个面向可扩展性和分布式架构的数据库,因此在数据一致性方面进行了一些权衡。MongoDB在默认配置下提供的是最终一致性,这意味着在复制和分片环境中,不同副本之间的数据同步可能存在一定的延迟。
5)生态系统
与一些传统关系数据库相比,MongoDB的生态系统相对较新,支持和工具生态系统相对有限。这意味着在使用特定工具或框架时,可能会遇到一些限制或缺乏成熟的解决方案。
此外,MongoDB还存在以下问题:在集群分片中的数据分布不均匀、持续插入大量数据时写入性能会有较大波动、单机可靠性较差等。
4、常用概念
在MongoDB中,一个数据库包含多个集合,一个集合中包含多个文档。这使得MongoDB在结构上与关系数据库类似,但又在某些方面保持了灵活性。例如,在关系数据库中,数据按照表格的形式进行存储和组织,而在MongoDB中,数据则以集合的形式进行存储和组织。另外,MongoDB是面向集合的存储,它支持的数据结构非常松散,是类似JSON的BSON格式。这使得MongoDB在处理大量数据时具有很高的效率。
数据库(Database):在MongoDB中,数据库是一个逻辑容器,用于存储数据。每个数据库都有自己的集合和权限。MongoDB支持多个数据库,并且每个数据库可以放置在不同的文件中。集合(Collection):集合是MongoDB中一组文档的集合。它类似于关系数据库中的表,但不需要在插入数据之前定义结构。集合中的文档可以有不同的字段和数据类型,这使得MongoDB非常灵活,可以根据需要存储各种类型的数据。集合(Collection):集合是MongoDB中一组文档的集合。它类似于关系数据库中的表,但不需要在插入数据之前定义结构。集合中的文档可以有不同的字段和数据类型,这使得MongoDB非常灵活,可以根据需要存储各种类型的数据。文档(Document):文档是MongoDB中的基本数据单元,类似于关系数据库中的行。文档以BSON(BinaryJSON)格式存储,这是一种类似于JSON的二进制格式,可以存储复杂的数据结构,包括数组、嵌套文档等。BSON:BSON是一种二进制格式的存储和交换数据的方式,是JSON的一种扩展,用于在网络传输过程中存储和读取数据。_id:在MongoDB中,每个文档都有一个唯一的_id字段作为主键,用于唯一标识该文档。这个字段可以是用户自定义的,也可以是MongoDB自动生成的。索引(Index):MongoDB支持通用的二级索引,适用于多种查询场景,并提供唯一索引、复合索引地理空间索引以及全文索引。索引可以提高查询性能,使得数据的检索更加快速和高效。聚合(Aggregation):MongoDB支持聚合管道(Aggregation Pipeline),可以用于数据的分析和处理。通过对数据进行分组、过滤、排序等操作,可以得到各种统计结果和数据摘要。复制(Replication):MongoDB支持数据复制功能,可以用于数据的备份和故障恢复。通过将数据复制到多个服务器上,可以提高数据的可靠性和可用性。分片(Sharding):MongoDB支持数据分片功能,可以将数据分布到多个服务器上存储和处理。这可以提高系统的扩展性和性能,使得MongoDB能够处理大规模的数据集。
传统数据库中有些概念与上述概念会出现重复,但意义可能不同。下表列出了传统关系数据库与MongoDB在数据库术语方面的对比。

5、数据类型
MongoDB支持多种数据类型,常见的数据类型如表所示。

其中有几个数据类型,是在传统数据库中不常见的,例如Object ID、Object等。Object ID类似于关系数据库中的主键ID。在MongoDB中,Object ID由12字节的字符组成,其中:
- 前4字节表示当前的UNIX时间戳。
- 之后的3字节是当前设备的机器标识码。
- 再之后的2字节是MongoDB服务器的进程ID。
- 最后3字节为计数器,计数器的起始值可以随机获得。

下面的示例展示了一个简单的文档结构:

其中_id是一个12字节的十六进制数字,可确保每个文档的唯一性,其结构如上述Object ID的组成所述。publish是一个标准化日期类型,类型名称为ISODate。at是一个长整型数字类型,类型名称为NumberLong。words是一个整型数字类型,类型名称为NumberInt。其余字段为字符串类型,类型名称为String(可省略)。
419



被折叠的 条评论
为什么被折叠?



