什么是 MongoDB?专家指南

Jeffrey Erickson | 高级撰稿人 | 2024 年 10 月 30 日

MongoDB 由几位开发人员于 2007 年创建,他们希望跟踪广告服务业务中的大量小型交易(因此称为“名称”)。这个新数据库最初被称为 10gen,它将数据存储在一个简单的 JSON 类型文件“存储桶”中,并且能够快速扩展。它不需要太多的数据模型或严格的事务并发性,因为它只是统计广告展示次数,风险较低。

然而,事实证明,MongoDB 提供了开发人员迫切需要的那种数据库简单性。它于 2009 年以开源开发模式推出,于 2018 年移至 SPL(服务器端公共许可证),并已发展成为许多开源开发堆栈的事实标准数据存储,客户列表包括 Expedia、Lyft、eBay 等。让我们看看是什么让它运转起来。

什么是 MongoDB?

MongoDB 是一个常用的开源文档数据库,在现代 Web 和移动应用中广泛使用。它被归类为 NoSQL 数据库,这意味着它需要一种灵活的、面向文档的方法来存储数据,而不是传统的基于表的关系方法。MongoDB 的吸引力的一个重要部分是它的简单性和开发者的重点。例如,Mongo 交互由首字母缩略词 CRUD 定义,也就是创建 (create)、读取 (read)、更新 (update) 和删除 (delete)。

MongoDB 将数据保存在 JSON 文档中,使存储数据(无论是结构化数据、非结构化数据还是半结构化数据)相对容易地用于不同类型的应用。MongoDB 的灵活数据模型允许开发人员存储非结构化数据,同时提供索引支持,以加快文件访问和复制,从而实现数据保护和可用性。这意味着开发人员可以使用 MongoDB 设计和构建复杂的应用程序。

虽然 MongoDB 是为了跟踪数千个广告服务网站的印象而开发的,但它很快成为开源 Web 开发中灵活的数据存储。它自 2007 年推出以来不断发展,积累了一个强大的功能集,包括即席查询、索引和实时聚合。对于开发人员来说,MongoDB 的一个关键好处是,相对于大多数流行的关系数据库,使用起来非常直观,并且快速入门。存储在 MongoDB 中的 JSON 文档的类型映射到常用编程语言(例如 JavaScript 或 Python 字典)中常见的数据类型。Mongo 还提供了全面的客户端库菜单,其中包含对大多数编程语言(包括 PHP、.Net、Java、Python、Node.js 和许多其他语言)的驱动程序支持。

与所有技术工具一样,MongoDB 在某些领域很强大,而在其他领域则很弱。它旨在跟踪在线广告,这需要快速同时访问,但只需要松散的交易准确性和很少的实时分析。即使在今天,MongoDB 也是围绕 BASE 原则形成的,BASE 原则代表可用性、可扩展性和最终一致性。因此,MongoDB 通常用于高可用性和可扩展性是主要设计注意事项的场景中。相比之下,对于财务运营或关键任务企业环境等工作,开发人员通常会选择关系数据库。这些事务处理提供 ACID 事务(原子性、一致性、隔离性和持久性),有助于确保数据库操作的可靠性和一致性。然而,最近,科技行业正在提供解决方案,通过 JSON 的开发简单性和 SQL 的优势,为开发人员充分发挥两者的优势

MongoDB 的工作原理图,说明如下:
MongoDB 的工作原理

如何将数据从应用程序传输到 MongoDB 数据库?

  • 各种编程语言的客户机应用程序与 MongoDB 数据库进行交互。
    1. 驱动程序是语言特定的库,允许应用程序与 MongoDB 进行通信。
    2. MongoDB 数据库服务器是存储和管理数据的位置。可以是单个集群、副本集群或分片集群。
    3. 数据文件将实际文档保存在 MongoDB 数据库中。
    4. 块存储系统是将文件分成固定大小的节并存储的地方
    该图说明了应用程序与 MongoDB 数据库之间的基本数据流。

    MongoDB 环境

    MongoDB 提供一系列配置和服务级别,可满足小型、中型甚至大型企业项目的开发人员的需求。

    • MongoDB Atlas 是 MongoDB 提供的数据库即服务产品,用于部署和管理多个云技术提供商的数据库。Atlas 可自动执行许多管理任务,例如缩放和备份。
    • MongoDB Community 是一个开源的数据库版本,专为寻找 NoSQL 解决方案的小型和中型项目而定制。由于它是开源的,它适合修改和创新,它为开发人员提供了一个强大的社区来寻找帮助。然而,Community 版本缺乏官方支持和服务级别协议 (SLA),安全保护选项较少,仅提供有限的管理工具。
    • MongoDB Enterprise Advanced 是 MongoDB Community 的高级商用版本。它提供了增强的安全选项和内存中存储引擎,以支持企业级用例。

    关键要点

    • MongoDB 是一个常用的 NoSQL 数据库,用于存储结构化、半结构化和非结构化数据。
    • MongoDB 不像在传统关系数据库中那样使用表,而是将数据存储在组织为集合的 JSON 文档中。
    • 由于 MongoDB 不需要刚性方案,因此它允许使用灵活的数据模型来演化以匹配应用程序功能中的更改。
    • MongoDB 最初是为广告服务业务中的快速存储和召回而设计的,几乎不考虑事务一致性或快速数据分析。后来的开发(例如分片功能)扩展了 MongoDB 的功能。
    • 由于 MongoDB 提供了与传统关系数据库不同的优势,因此开发人员通常会设法充分利用这两种方法

    MongoDB 详解

    MongoDB 是一个 NoSQL 数据库,使用面向文档的数据模型,其中每条记录都是存储在集合中的文档,而不是常用关系数据库(如 MySQL)常见的行和列。

    MongoDB 使用称为 BSON 或二进制 JSON 的格式存储 JSON 文档。这些文档的非关系性意味着它们可以存储(数据库可以处理)结构化应用数据以及半结构化和非结构化数据。与关系数据库不同,MongoDB 不使用刚性方案。相反,文档是灵活的,可以包含数组和嵌套文档,从而实现复杂和分层的数据存储。

    在处理极其庞大的数据集时,文档数据库(如 MongoDB)使用称为分片的技术横向扩展或跨多个节点或集群分布数据。该模型允许快速存储和撤回。由于 MongoDB 是为广告投放而创建的,因此该架构很有意义,在任何时候,可能需要在数千个网站中调用数百万个广告。无需对广告逐一进行分析,这使得数据能够物理分布和分离。

    分层文档数据库对于读取操作非常快,但由于系统必须分析所有嵌套实体中的数据,因此数据分析可能会很慢。相比之下,关系数据库将数据存储在单独的表中,单个“对象”可以引用在数据库中的许多表中,从而实现更高效的大规模分析操作。鉴于这些不同的优势,开发团队通常会根据应用当前的需求选择合适的数据管理系统。或者,他们可以选择多模式数据库,以提供对关系和 JSON 文档数据以及许多其他数据类型的完整 SQL 访问。

    ACID 与 BASE

    您选择的内容取决于您的应用程序的需求。

    ACID(原子性、一致性、隔离性、耐久性) BASE(基本可用,软状态,最终一致)

    原子性:确保将整个事务处理视为单个单位。所有更改要么成功,要么都不成功。这样可以防止部分更新,从而使数据处于不一致状态。

    一致性:保证数据库在事务处理后从一个有效状态转换为另一个有效状态。强制实施业务规则和数据完整性。

    隔离:确保并发事务处理不会相互干扰。每个事务似乎是单独执行的,即使多个事务同时发生。

    持久性:提交事务处理后,所做的更改将写入永久存储,不会受到系统故障(例如崩溃)的影响。

    基本可用:侧重于尽可能提高数据可用性。即使在部分故障期间,系统仍会努力保持运行状态,从而允许大多数读取和写入操作继续。

    软状态:在执行写入操作后,不会立即保证数据一致性。在所有副本中反映更改之前,可能会略有延迟,从而导致暂时不一致。

    最终一致:随着时间的推移,通过跨副本同步更改的后台进程实现一致性。

    优点:

    高数据完整性和高一致性使 ACID 成为需要准确性的应用的理想选择,例如财务交易。

    优点:

    高可用性和可扩展性使 BASE 非常适合需要高正常运行时间和响应性的应用,尤其是在分布式系统中。轻松的一致性要求可加快写入速度并提高可扩展性。

    缺点:

    性能开销意味着保持 ACID 保证会导致写入速度变慢。严格的一致性要求在高度可扩展的环境中进行管理可能会变得非常困难。

    缺点:

    数据同步期间可能会出现临时不一致,这使得 BASE 不适合严格的数据完整性和即时一致性至关重要的应用程序。

    MongoDB 的工作原理

    MongoDB 将数据存储在集合中,这与关系数据库中的表类似。每个集合包含多个文档,这些文档的结构可能会有所不同。无需向系统声明文档的结构,因为文档是自描述的,这意味着每个文档都包含描述文档中每个字段的元数据。

    为了提高性能,MongoDB 支持对文档中的任何字段进行索引。索引支持高效执行查询,并且可以包括主索引和辅助索引。MongoDB 的查询语言支持 CRUD(创建,读取,更新,删除)操作,并允许复杂的聚合,文本搜索和地理空间查询。为了帮助缩短响应时间,MongoDB 提供了一个聚合框架,允许开发人员在服务器端设置复杂的数据处理。这意味着它能够在数据所在的集群上执行分析,而无需将其迁移到其他平台,例如 Apache SparkHadoop。这可以减少传输到客户和从客户传输的数据量。

    MongoDB 致力于通过支持副本数据集来提供高可用性和提高性能。副本可以通过在所有实例之间分配读写操作来进行负载平衡。这些副本集还通过不同数据库服务器上的多个数据副本提供冗余并提高数据可用性。在发生硬件故障或维护时,副本集允许 MongoDB 提供自动故障转移和数据冗余。

    为了实现可扩展性,MongoDB 支持通过分片进行横向扩展,这是在多台计算机上的多个数据库之间分配数据的一种方式。分片集群可以包含许多副本集。通过定义分片密钥来配置分片,该密钥确定数据在分片中的分布方式。此技术可以通过划分数据集并通过多个服务器进行负载来帮助管理大型数据集和高吞吐量操作。


    分片如何工作

    每个分片都是一个独立的数据库实例,托管着经过分片的数据库数据的子集。

    分片如何工作图表
    该图显示了从顶部的客户机应用程序到底部的数据库分片的单向流。

    MongoDB 与 RDBMS

    每种类型的数据库(如 MySQL、Postgres 和 Oracle Database)或面向文档的数据库(如 CouchDB、DynamoDB 和 MongoDB)都有优点和缺点,它们之间的选择通常取决于所开发的应用程序的特定要求和约束条件。

    关系数据库管理系统 (RDBMS) 使用结构化查询语言 (SQL),而 MongoDB 以文档为中心的格式使用文档存储 API。即便如此,MongoDB Query Language (MQL) 使用类似 JavaScript 的语言来执行创建、读取、更新和删除文档等操作。

    MongoDB 没有表和行的概念,缺少 schema,因此在可以使用数据库之前定义结构较少。但是,由于没有中央 schema,访问集合的每个应用都需要了解文档。因此,"schema" 在应用代码中,而不是在数据库中定义。如果一个应用更改了 schema,其他应用可能会中断。与关系数据库相比,如果 schema 本质上是 RDBMS 的蓝图,并且明确定义了数据组织和相互关系,则 MongoDB 缺乏数据之间关系的固有概念。

    数据存储的灵活性值得注意,因为 MongoDB 对键值存储、图形和文档等数据使用不同的格式,并且数据结构可能会随时间而变化。这与 RDBMS 不同,RDBMS 基于 RDBMS 使用严格的定义、层次结构和验证过程来帮助确保数据完整性。

    虽然设置基本 MongoDB 实例很简单,但配置和维护具有分片和副本的大规模分布式 MongoDB 集群可能很复杂,需要很好地了解其体系结构和配置选项。


    主要差异

    关系型 MongoDB
    数据模型 使用具有固定行和列的表,数据按照预定义 schema 进行结构化。 使用文档集合,这些文档是具有动态 schema 的类似 JSON 的结构。
    Schema 灵活性 需要在添加数据之前必须设置的预定义 schema。 具有动态 schema。新字段可以添加到文档,而不会影响集合中的所有其他文档。
    查询语言 使用对复杂查询、定义和处理数据非常强大的 SQL。 使用一种基于文档的查询语言,该语言被认为比 SQL 更直观但更不完整且功能更全面。
    扩展 虽然分片和 Oracle Real Application Clusters 等成熟功能支持水平扩展,但传统上可以垂直扩展,从而为现有计算机增加更多功能。 专为使用分片横向扩展多台机器而设计,分片将数据分布在一组机器之间。
    事务处理 支持多行事务处理,并且符合 ACID,因此适用于任何数据都不会丢失或损坏的应用。 支持多文档事务,但众所周知,其稳定性不如大多数传统关系数据库,尤其是在分布式数据中。
    性能 专为确保事务处理准确而构建,但对于大型数据量,性能可能会降低。但是,分析性能通常较好。 专为跨大量数据实现高读取性能而构建。

    为什么要使用 MongoDB?

    MongoDB 适用于各种用途,从简单的 CRUD 应用程序(例如博客或记事应用程序)到复杂的平台(例如 Amazon Prime)。MongoDB 通常用于内容管理系统 (CMSes)、数据同步必须快速的游戏应用程序以及生物识别医疗保健数据等许多其他用例。其多功能性使其成为流行的开源开发堆栈(例如 MEANMERN)的基石。

    在需要时选择:

    • 灵活性。MongoDB 的 JSON 文档格式提供了一种简单直观的方式来表示分层数据结构,否则需要通过 SQL 查询进行复杂联接。
    • 可用性。MongoDB 的分布式数据库功能提供了高可用性,即使有大型的,经常变化的数据集。
    • 可扩展性。MongoDB 旨在收集、处理和分析大型、快速变化和多样化的数据集。
    • 性能。通过复制、分片等方法来优化性能,使 MongoDB 成为媒体和娱乐等领域的大型应用的可行选择。
    • 兼容性。MongoDB 的 JSON 类型文档提供了与常用编程语言中熟悉的数据类型的轻松兼容性。此外,MongoDB 客户端库还为大多数编程语言(例如 PHP、.Net、JavaScript 等)提供驱动程序。
    • 社区支持。MongoDB 是许多开源开发堆栈中的事实上的标准数据存储,社区支持非常丰富。

    MongoDB 功能

    MongoDB 已经受到开发人员的欢迎,部分原因在于其直观的 API、灵活的数据模型以及包含以下功能的特性:

    • 即席查询。MongoDB 支持字段、范围和正则表达式查询,可以返回整个文档、特定文档字段或随机结果示例。
    • 编制索引。MongoDB 支持多种不同的索引类型,包括单个字段、复合(多个字段)、多键(数组)、地理空间、文本和散列。
    • 复制。MongoDB 通过包含两个或多个数据副本的副本集提供高可用性。写入由主副本处理,而任何副本都可以处理读取请求。如果主副本发生故障,则将辅助副本提升为主副本。
    • 可扩展性。通过分片增强了 MongoDB 数据库中的扩展功能,因为集群只在集合中存储部分数据。分片键确定该数据的分布。
    • 负载平衡。MongoDB 可以垂直和水平扩展,由于分片集群,负载平衡可以由数据库的基本结构处理。复制可用于减少主服务器上的负载。
    • 文件存储。数据存储在文档中,这些文档以大多数编程语言轻松映射到对象,从而可以在应用程序中轻松访问数据。
    • 批处理。可以通过多种方式完成数据处理。有时它是在文档本身中完成的,其他时候使用批量写入方法来减少网络操作。

    MongoDB 的优势

    MongoDB 在开源社区中的普及归因于它使应用程序开发和维护更加直观和可扩展的多种方式。这些优点包括:

    • 易于开发人员使用。开发人员通常会选择 MongoDB,因为它易于在云端下载或访问,这意味着他们可以快速入门,部分原因是它更容易使用文档,而不是创建数据模型和处理表。
    • 效率。JSON 提供了许多效率,具有较小的文档文件和易于阅读的内容。MongoDB 以二进制格式 (BSON) 对文档进行编码,与纯文本相比,该格式更紧凑、解析速度更快。
    • 灵活的 schema。MongoDB 的文档数据模型允许灵活和自描述的 schema,字段可以因文档而异。
    • 简单查询语言。MongoDB Query Language (MQL) 为便于开发人员使用而设计,支持复杂查询和索引,从而加快常用查询速度。
    • 云原生。MongoDB Atlas 是一个云原生数据库,因此可以频繁更新并快速适应新技术。它的使用也使将应用迁移到云端更加容易。

    MongoDB 的劣势

    虽然 MongoDB 具有许多优势,特别是对于在大量数据的情况下需要灵活性和高性能的应用程序,但它确实存在许多潜在的缺点。

    • 交易支持。MongoDB 事务处理支持不像传统关系数据库中那样成熟或强大。复杂的事务,特别是跨多个操作的事务,可能性能不佳,在 MongoDB 中实施可能具有挑战性。
    • 数据一致性。MongoDB 对副本集的“最终一致性”的使用可能导致所有用户同时读取相同数据的情况。对于需要强一致性的应用程序,这可能是一个严重的缺点。
    • 联接操作。MongoDB 不支持 SQL 数据库的联接方式。然而,它确实提供了执行类似功能的选项,尽管它们通常效率较低,并可能导致更复杂的查询和更慢的性能 - 特别是在处理文档之间的复杂关系时。
    • 内存使用。MongoDB 将其常用的数据和索引存储在 RAM 中,因此其性能高度依赖于具有足够的 RAM。因此,MongoDB 数据库比其他数据库消耗更多的内存资源,甚至可能消耗更多的硬件。
    • 存储开销。与关系数据库中的高度规范化表相比,MongoDB 使用的自包含文档范式可能会导致更大的存储需求。此外,MongoDB 的动态 schema 可能会导致数据冗余和碎片化,从而增加存储使用和成本。
    • 索引限制。MongoDB 支持许多索引选项,但维护大量索引可能会降低写入性能。它不适合频繁写入,因为每次写入操作可能需要更新多个索引 — 这通常会使查询性能与写入性能发生冲突。
    • 成本。在需要高可用性和横向扩展的情况下,运行和维护 MongoDB 集群(尤其是在云端环境中)所需的成本可能会很大。对大量 RAM 和存储的需求也会增加成本。在副本数据库需要相同数量资源的高可用性情况下尤其如此。

    MongoDB 的兼容性

    MongoDB 是一个 NoSQL 数据库,在该生态系统中运行良好,但它也通过各种数据集成工具和连接器与其他类型的数据库管理系统进行交互。此工具集包括 ETL(提取、转换、加载)基础结构,用于从 MongoDB 中提取和迁移数据,反之亦然。这对于将数据发送到关系数据库以进行报告和复杂的数据分析非常有用。使用 REST API,MongoDB 应用还可以跨不同的数据库平台进行通信。

    在 Oracle Autonomous Database 中运行 MongoDB 工作负载

    Oracle Database API for MongoDB 是 MongoDB 兼容性的一个很好的例子,它允许开发人员使用 MongoDB 的开源工具和连接到 Oracle Autonomous JSON Database 的驱动程序。这使他们能够访问 Oracle 的多模型功能,并避免将数据移动到单独的数据库进行分析、机器学习 (ML) 和空间分析。将 Autonomous JSON Database 视为 MongoDB Atlas 的多模式替代方案。通常,现有应用程序几乎不需要改变,甚至完全不需要改变。

    将 MongoDB 工作负载迁移到 Oracle Autonomous JSON Database

    开发人员无需通过 API 访问 MongoDB 功能,只需在 Oracle Cloud Infrastructure (OCI) 上将以 JSON 为中心的工作负载迁移到 Oracle Autonomous JSON Database。这为以 JSON 为中心的应用提供了云技术文档数据库服务,该服务具有 NoSQL 样式的文档 API(简单的 Oracle Document Access 或 SODA 以及适用于 MongoDB 的 Oracle Database API)、无服务器扩展、高性能 ACID 事务、全面的安全性和低按使用付费的定价。Oracle Cloud Infrastructure (OCI) GoldenGate 支持从 MongoDB 迁移到 Oracle Autonomous JSON Database,因此不会造成停机。

    Autonomous Database 快速入门

    MongoDB 用户现在有了一种更通用的方法来构建以 JSON 为中心的应用。Oracle Autonomous Database 可帮助开发人员灵活地使用单一数据平台来满足业务需求,从而在单一数据库中快速构建 SQL、JSON 文档、图形、地理空间、文本和向量。

    此外,Oracle Database 中的一项革命性新功能 JSON Relational Duality 提供了关系表和 JSON 文档的优势,而无需权衡任一模型。

    Autonomous Database 提供集成的 AI 服务和数据库内机器学习 (ML),通过文本和图像分析、语音识别或个性化推荐来增强应用。此外,Autonomous Database Select AI 可自动将自然语言转换为数据库查询,支持您与数据库进行情景化对话,无需通过复杂界面进行任何定制编码或手动操作。由于数据库是完全自治的,因此开发团队可以通过自动化安全措施和持续监视来确保正常运行时间并保护数据,从而专注于构建应用。

    您可以立即免费开始使用,甚至参加研讨会,了解如何在同一应用中使用 SQL、JSON 和 Oracle Graph

    凭借包括电商平台、物联网应用等在内的用例,MongoDB 已证明其跨行业的多功能性。它能够处理各种数据类型并支持复杂的查询,使其成为现代技术堆栈的强大组件。随着企业寻求从其数据中提取更大的价值,MongoDB 将决定成败。

    开发人员及其业务同事都可以从专为提高敏捷性、可扩展性和效率而设计的云原生应用中受益。了解云计算变得更加完善的另外 10 个方面。

    MongoDB 常见问题解答

    SQL 与 MongoDB 有何区别?

    MongoDB 保存不适合结构化查询语言 (SQL) 的非结构化数据。

    MongoDB 是后端语言吗?

    不可以,但可以用作后端 Web 应用程序的一部分。

    MongoDB 是语言还是框架?

    它是一个数据库管理系统,使用存储在文档而不是表中的非结构化数据。

    注:为免疑义,本网页所用以下术语专指以下含义:

    1. 除Oracle隐私政策外,本网站中提及的“Oracle”专指Oracle境外公司而非甲骨文中国 。
    2. 相关Cloud或云术语均指代Oracle境外公司提供的云技术或其解决方案。