
MongoDB简介1、MongoDB概述2、MongoDB的发展历史3、MongoDB的优缺点1.3、MongoDB的优点3.2、MongoDB的缺点4、常用概念5、数据类型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可以用于存储物联网设备的数据如智能设备信息、传感器数据、位置信息等。例如IoTInternet 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-rc05.0.0-rc15.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的二进制格式可以存储复杂的数据结构包括数组、嵌套文档等。BSONBSON是一种二进制格式的存储和交换数据的方式是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可省略。