MongoDB到底是什么?(非常全面)
随着大数据时代的到来,数据呈爆炸式增长,这使得传统的关系数据库面临越来越大的挑战。高性能、可扩展的数据库变得越来越重要。在这样的场景下,非关系数据库应运而生,并且越来越受到欢迎。MongoDB 便是非关系数据库的典型代表。
MongoDB 是一个介于关系数据库与非关系数据库之间的产品,是非关系数据库中功能最丰富、最像关系数据库的 NoSQL 数据库。
MongoDB 是一款为 Web 应用和互联网基础设施设计的数据库管理系统。它使用 C++ 语言编写,是一个可扩展、开源、表结构自由的数据库,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。它支持的数据格式是 BSON,一种类似于 JSON 的二进制形式的存储格式,即 Binary JSON,这种格式与 JSON 一样能够支持内嵌的文档对象和数组对象。
MongoDB 凭借其出色的数据存储功能,已成为当前非关系数据库领域的佼佼者。根据 DB-Engines 网站目前最新的统计(2024 年 11 月),前 20 个数据库各项指标的排名如下图所示:

图 1 DBMS Ranking
可以看到,MongoDB 在数据库领域总排名第 5,仅次于 Oracle、MySQL 等关系数据库,在 NoSQL 数据库领域排名首位。
综合 MongoDB 官网提供的信息、权威机构的评价以及开发者总结的博客,可以大概整理出 MongoDB 属性的相关信息,如下表所示。
此外,MongoDB 作为开源项目,对开发者的支持非常友好。MongoDB 官方提供了众多学习及解决问题的途径,包括官方的 API 文档、开发者中心、社区以及 MongoDB 学校。这些途径使得开发者在资料搜集以及问题解决方面节省了非常多的时间,并且能够得到非常权威的解答。
MongoDB 官方提供的资源地址如下表所示:
MongoDB 还公布了有史以来所有 BUG 的报告,使用者可以跟踪 BUG 列表查看所有的问题记录,有针对性地选择适用自己的版本,避开缺陷。
从目前的市场占有量来看,MongoDB 的应用已经渗透到各个领域。以下是一些主要的应用场景:
与关系数据库不同,MongoDB 的文档无须预先定义 Schema。在关系数据库中,每张表都有严格定义的 Schema,规定了列和类型,这种模式使得扩展变得非常困难,有时甚至会因为一小部分数据的变更而需要修改整个表结构。
在 MongoDB 中,同一个集合可以包含具有不同字段(类型)的文档对象,并且支持使用 JSON Schema 来规范数据模式。理论上,集合中的每个文档都可以拥有完全不同的结构。但在实践中,一个集合中的文档通常相对统一。例如,在一个订单集合中,每个文档通常都包含订单号、商品内容、创建时间、购买人、价格等字段。
MongoDB 在保证模式的灵活性和动态性的同时,还提供了强大的数据治理能力。
同时,MongoDB 还支持故障恢复功能。例如,当主节点出现故障时,系统可以自动切换到从节点,以保证数据库的可用性、完整性和可靠性。
从 MongoDB 3.2 版本开始支持 WiredTiger 存储引擎。与此同时,WiredTiger 成为 MongoDB 的默认存储引擎,不再使用 MMAPv1 作为默认存储引擎。WiredTiger 存储引擎通过使用不同的数据结构,在兼顾磁盘 I/O 操作的同时,维持了获取数据的高速度。
除上述两种存储引擎外,MongoDB 还提供了一个 InMemory 存储引擎。该引擎将数据仅存储在内存中,而将少量的元数据和诊断日志存储到硬盘文件中。由于无须进行磁盘 I/O 操作,使用 InMemory 存储引擎可以显著降低数据查询的延迟,从而快速获取所需的数据。然而,这种存储方式并不适合大规模数据存储,因为一旦服务器宕机,内存中的数据将会丢失。
此外,MongoDB 还存在以下问题:在集群分片中的数据分布不均匀、持续插入大量数据时写入性能会有较大波动、单机可靠性较差等。
MongoDB 是一个介于关系数据库与非关系数据库之间的产品,是非关系数据库中功能最丰富、最像关系数据库的 NoSQL 数据库。
MongoDB 是一款为 Web 应用和互联网基础设施设计的数据库管理系统。它使用 C++ 语言编写,是一个可扩展、开源、表结构自由的数据库,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。它支持的数据格式是 BSON,一种类似于 JSON 的二进制形式的存储格式,即 Binary JSON,这种格式与 JSON 一样能够支持内嵌的文档对象和数组对象。
MongoDB 凭借其出色的数据存储功能,已成为当前非关系数据库领域的佼佼者。根据 DB-Engines 网站目前最新的统计(2024 年 11 月),前 20 个数据库各项指标的排名如下图所示:

图 1 DBMS Ranking
可以看到,MongoDB 在数据库领域总排名第 5,仅次于 Oracle、MySQL 等关系数据库,在 NoSQL 数据库领域排名首位。
综合 MongoDB 官网提供的信息、权威机构的评价以及开发者总结的博客,可以大概整理出 MongoDB 属性的相关信息,如下表所示。
参数名称 | 描述 |
---|---|
首选数据模型 | 文档存储 |
其他数据模型 | 空间存储、搜索引擎、时间序列存储 |
DB-Engines 排名 | 总排名第 5,文档存储型第一 |
官网地址 | www.mongodb.com |
首次发行版本时间 | 2009 |
当前最新版本 | 2023 年 3 月发行的 6.0.5 版本 |
开源与否 | 开源 |
是否支持独立服务器部署 | 支持 |
DBaaS(数据库即服务) | MongoDB Atlas、ScaleGrid for MongoDB Database |
编写语言 | C++ |
支持的平台 | Linux、OS X、Solaris、Windows |
数据模式 | 自由模式 |
标准的数据类型 | string, integer, double, decimal, boolean, date, object_id, geospatial |
第二索引 | 支持 |
SQL 支持 | 通过 MongoDB Atlas SQL 接口进行只读 SQL 查询 |
API 以及其他接口方法 | GraphQL、HTTP REST、Prisma |
支持的编程语言 | 市面上主流的编程语言基本都支持 |
服务端脚本语言 | JavaScript |
触发器 | 仅在 MongoDB Atlas 中支持 |
分区方法 | Sharding |
复制集方法 | 可通过 MongoDB Atlas 实现 |
MapReduce | 支持 |
分布式中的数据一致性方案 | 默认为即时一致性,可配置最终一致性 |
事务 | 多文档事务 |
并发 | 支持 |
数据持久化 | 支持 |
内存存储 | 支持 |
外键限制 | 无 |
用户权限控制 | 支持 |
此外,MongoDB 作为开源项目,对开发者的支持非常友好。MongoDB 官方提供了众多学习及解决问题的途径,包括官方的 API 文档、开发者中心、社区以及 MongoDB 学校。这些途径使得开发者在资料搜集以及问题解决方面节省了非常多的时间,并且能够得到非常权威的解答。
MongoDB 官方提供的资源地址如下表所示:
名称 | 说明 | 地址 | 描述 |
---|---|---|---|
Documentation | 开发文档 | https://docs.mongodb.com/manual/ | 网站式的开发文档、操作手册,包含 MongoDB 介绍、安装使用以及各项功能说明,支持搜索查询 |
Developer Center | 开发者中心 | https://www.mongodb.com/developer/ | 开发者中心,汇聚各种开发语言的教程,支持按语言分类搜索,支持常见问题解答 |
MongoDB University | MongoDB 学校 | https://learn.mongodb.com | MongoDB 学校,可以根据不同重点内容进行学习,支持按语言搜索,包含 MongoDB 各方面的课程 |
Developer Community | 开发者社区 | https://www.mongodb.com/community/forums | 开发者社区,这里汇聚了使用各种开发语言的开发者,涵盖在使用 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 可以用于存储和检索这些数据以进行系统监控、性能分析和故障排除。
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。MongoDB的不足
正如许多技术解决方案一样,MongoDB在提供强大功能的同时,也存在一些潜在的局限性。以下是 MongoDB 的一些主要缺点。1) 高存储空间消耗
MongoDB 通常会占用更多的磁盘空间,因为它为每个文档存储键和其他一些元数据,同时在集合和数据库级别维护索引。2) 较高的内存消耗
MongoDB 倾向于使用更多的内存来提供更高的性能,尤其是在索引和聚合操作中,这可能导致更高的内存消耗。3) 查询性能与复杂性
虽然 MongoDB 可以快速执行简单的查询,但对于复杂的查询和聚合操作,可能需要编写更复杂的聚合管道或使用 MapReduce。这相比关系数据库的 SQL 查询,可能需要更多的开发工作。4) 数据一致性
MongoDB 是一个面向可扩展性和分布式架构的数据库,因此在数据一致性方面进行了一些权衡。MongoDB 在默认配置下提供的是最终一致性,这意味着在复制和分片环境中,不同副本之间的数据同步可能存在一定的延迟。5) 生态系统
与一些传统关系数据库相比,MongoDB 的生态系统相对较新,支持和工具生态系统相对有限。这意味着在使用特定工具或框架时,可能会遇到一些限制或缺乏成熟的解决方案。此外,MongoDB 还存在以下问题:在集群分片中的数据分布不均匀、持续插入大量数据时写入性能会有较大波动、单机可靠性较差等。