Jeffrey Erickson | 高级撰稿人 | 2024 年 10 月 30 日
MongoDB 由几位开发人员于 2007 年创建,他们希望跟踪广告服务业务中的大量小型交易(因此称为“名称”)。这个新数据库最初被称为 10gen,它将数据存储在一个简单的 JSON 类型文件“存储桶”中,并且能够快速扩展。它不需要太多的数据模型或严格的事务并发性,因为它只是统计广告展示次数,风险较低。
然而,事实证明,MongoDB 提供了开发人员迫切需要的那种数据库简单性。它于 2009 年以开源开发模式推出,于 2018 年移至 SPL(服务器端公共许可证),并已发展成为许多开源开发堆栈的事实标准数据存储,客户列表包括 Expedia、Lyft、eBay 等。让我们看看是什么让它运转起来。
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 是一个 NoSQL 数据库,使用面向文档的数据模型,其中每条记录都是存储在集合中的文档,而不是常用关系数据库(如 MySQL)常见的行和列。
MongoDB 使用称为 BSON 或二进制 JSON 的格式存储 JSON 文档。这些文档的非关系性意味着它们可以存储(数据库可以处理)结构化应用数据以及半结构化和非结构化数据。与关系数据库不同,MongoDB 不使用刚性方案。相反,文档是灵活的,可以包含数组和嵌套文档,从而实现复杂和分层的数据存储。
在处理极其庞大的数据集时,文档数据库(如 MongoDB)使用称为分片的技术横向扩展或跨多个节点或集群分布数据。该模型允许快速存储和撤回。由于 MongoDB 是为广告投放而创建的,因此该架构很有意义,在任何时候,可能需要在数千个网站中调用数百万个广告。无需对广告逐一进行分析,这使得数据能够物理分布和分离。
分层文档数据库对于读取操作非常快,但由于系统必须分析所有嵌套实体中的数据,因此数据分析可能会很慢。相比之下,关系数据库将数据存储在单独的表中,单个“对象”可以引用在数据库中的许多表中,从而实现更高效的大规模分析操作。鉴于这些不同的优势,开发团队通常会根据应用当前的需求选择合适的数据管理系统。或者,他们可以选择多模式数据库,以提供对关系和 JSON 文档数据以及许多其他数据类型的完整 SQL 访问。
ACID 与 BASE
您选择的内容取决于您的应用程序的需求。
| ACID(原子性、一致性、隔离性、耐久性) | BASE(基本可用,软状态,最终一致) |
|---|---|
|
原子性:确保将整个事务处理视为单个单位。所有更改要么成功,要么都不成功。这样可以防止部分更新,从而使数据处于不一致状态。 一致性:保证数据库在事务处理后从一个有效状态转换为另一个有效状态。强制实施业务规则和数据完整性。 隔离:确保并发事务处理不会相互干扰。每个事务似乎是单独执行的,即使多个事务同时发生。 持久性:提交事务处理后,所做的更改将写入永久存储,不会受到系统故障(例如崩溃)的影响。 |
基本可用:侧重于尽可能提高数据可用性。即使在部分故障期间,系统仍会努力保持运行状态,从而允许大多数读取和写入操作继续。 软状态:在执行写入操作后,不会立即保证数据一致性。在所有副本中反映更改之前,可能会略有延迟,从而导致暂时不一致。 最终一致:随着时间的推移,通过跨副本同步更改的后台进程实现一致性。 |
|
优点: 高数据完整性和高一致性使 ACID 成为需要准确性的应用的理想选择,例如财务交易。 |
优点: 高可用性和可扩展性使 BASE 非常适合需要高正常运行时间和响应性的应用,尤其是在分布式系统中。轻松的一致性要求可加快写入速度并提高可扩展性。 |
|
缺点: 性能开销意味着保持 ACID 保证会导致写入速度变慢。严格的一致性要求在高度可扩展的环境中进行管理可能会变得非常困难。 |
缺点: 数据同步期间可能会出现临时不一致,这使得 BASE 不适合严格的数据完整性和即时一致性至关重要的应用程序。 |
MongoDB 将数据存储在集合中,这与关系数据库中的表类似。每个集合包含多个文档,这些文档的结构可能会有所不同。无需向系统声明文档的结构,因为文档是自描述的,这意味着每个文档都包含描述文档中每个字段的元数据。
为了提高性能,MongoDB 支持对文档中的任何字段进行索引。索引支持高效执行查询,并且可以包括主索引和辅助索引。MongoDB 的查询语言支持 CRUD(创建,读取,更新,删除)操作,并允许复杂的聚合,文本搜索和地理空间查询。为了帮助缩短响应时间,MongoDB 提供了一个聚合框架,允许开发人员在服务器端设置复杂的数据处理。这意味着它能够在数据所在的集群上执行分析,而无需将其迁移到其他平台,例如 Apache Spark 或 Hadoop。这可以减少传输到客户和从客户传输的数据量。
MongoDB 致力于通过支持副本数据集来提供高可用性和提高性能。副本可以通过在所有实例之间分配读写操作来进行负载平衡。这些副本集还通过不同数据库服务器上的多个数据副本提供冗余并提高数据可用性。在发生硬件故障或维护时,副本集允许 MongoDB 提供自动故障转移和数据冗余。
为了实现可扩展性,MongoDB 支持通过分片进行横向扩展,这是在多台计算机上的多个数据库之间分配数据的一种方式。分片集群可以包含许多副本集。通过定义分片密钥来配置分片,该密钥确定数据在分片中的分布方式。此技术可以通过划分数据集并通过多个服务器进行负载来帮助管理大型数据集和高吞吐量操作。
分片如何工作
每个分片都是一个独立的数据库实例,托管着经过分片的数据库数据的子集。
每种类型的数据库(如 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 适用于各种用途,从简单的 CRUD 应用程序(例如博客或记事应用程序)到复杂的平台(例如 Amazon Prime)。MongoDB 通常用于内容管理系统 (CMSes)、数据同步必须快速的游戏应用程序以及生物识别医疗保健数据等许多其他用例。其多功能性使其成为流行的开源开发堆栈(例如 MEAN 和 MERN)的基石。
在需要时选择:
MongoDB 已经受到开发人员的欢迎,部分原因在于其直观的 API、灵活的数据模型以及包含以下功能的特性:
MongoDB 在开源社区中的普及归因于它使应用程序开发和维护更加直观和可扩展的多种方式。这些优点包括:
虽然 MongoDB 具有许多优势,特别是对于在大量数据的情况下需要灵活性和高性能的应用程序,但它确实存在许多潜在的缺点。
MongoDB 是一个 NoSQL 数据库,在该生态系统中运行良好,但它也通过各种数据集成工具和连接器与其他类型的数据库管理系统进行交互。此工具集包括 ETL(提取、转换、加载)基础结构,用于从 MongoDB 中提取和迁移数据,反之亦然。这对于将数据发送到关系数据库以进行报告和复杂的数据分析非常有用。使用 REST API,MongoDB 应用还可以跨不同的数据库平台进行通信。
Oracle Database API for MongoDB 是 MongoDB 兼容性的一个很好的例子,它允许开发人员使用 MongoDB 的开源工具和连接到 Oracle Autonomous JSON Database 的驱动程序。这使他们能够访问 Oracle 的多模型功能,并避免将数据移动到单独的数据库进行分析、机器学习 (ML) 和空间分析。将 Autonomous JSON Database 视为 MongoDB Atlas 的多模式替代方案。通常,现有应用程序几乎不需要改变,甚至完全不需要改变。
开发人员无需通过 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,因此不会造成停机。
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 个方面。
SQL 与 MongoDB 有何区别?
MongoDB 保存不适合结构化查询语言 (SQL) 的非结构化数据。
MongoDB 是后端语言吗?
不可以,但可以用作后端 Web 应用程序的一部分。
MongoDB 是语言还是框架?
它是一个数据库管理系统,使用存储在文档而不是表中的非结构化数据。
注:为免疑义,本网页所用以下术语专指以下含义: