什么是 MongoDB?简介、架构、功能与示例
什么是 MongoDB?
MongoDB 是一种面向文档的NoSQL数据库,用于高吞吐量的数据存储。与传统的支持表和行的关系型数据库不同,MongoDB 使用集合(Collections)和文档(Documents)。文档由键值对组成,这是 MongoDB 中的基本数据单元。集合包含一组文档,相当于关系型数据库中的表。MongoDB 大约在 2000 年代中期出现。
MongoDB 的特点
- 每个数据库包含集合,集合又包含文档。每个文档可以不同,包含的字段数量也可能不同。每个文档的大小和内容也可能不同。
- 文档结构更符合开发人员在其各自编程语言中构造类和对象的方式。开发人员通常会说他们的类不是行和列,而是具有键值对的清晰结构。
- 行(或 MongoDB 中的文档)不需要预先定义模式。字段可以即时创建。
- MongoDB 提供的数据模型允许您更轻松地表示分层关系、存储数组和其他更复杂的数据结构。
- 可伸缩性——MongoDB 环境非常可伸缩。世界各地的公司都定义了集群,其中一些集群运行了 100 多个节点,数据库中包含数百万个文档。
MongoDB 示例
下面的示例展示了如何在 MongoDB 中建模文档。
- MongoDB 会为 OrderID 字段添加 _id 字段,以唯一标识集合中的文档。
- 您会注意到,在 RDBMS 中通常需要单独的表来存储的 Order Data(OrderID、Product 和 Quantity),在 MongoDB 中实际上是作为嵌入式文档存储在集合本身中的。这是 MongoDB 中数据建模的一个关键区别。
MongoDB 架构的关键组件
以下是 MongoDB 中使用的一些常用术语
- _id – 这是每个 MongoDB 文档都需要的字段。_id 字段代表 MongoDB 文档中的唯一值。_id 字段就像文档的主键。如果您创建一个没有 _id 字段的新文档,MongoDB 会自动创建该字段。例如,如果我们看一下上面客户表的示例,MongoDB 将为集合中的每个文档添加一个 24 位唯一标识符。
_Id | CustomerID | CustomerName | 订单ID |
---|---|---|---|
563479cc8a8a4246bd27d784 | 11 | Guru99 | 111 |
563479cc7a8a4246bd47d784 | 22 | Trevor Smith | 222 |
563479cc9a8a4246bd57d784 | 33 | Nicole | 333 |
- 集合 (Collection) – 这是 MongoDB 文档的集合。集合相当于在 Oracle 或 MS SQL 等任何其他 RDMS 中创建的表。集合存在于单个数据库中。如介绍中所见,集合不强制执行任何结构。
- 游标 (Cursor) – 这是查询结果集的指针。客户端可以迭代游标以检索结果。
- 数据库 (Database) – 这是集合的容器,就像 RDMS 中表的容器一样。每个数据库在文件系统上都有自己的文件集。MongoDB 服务器可以存储多个数据库。
- 文档 (Document) – MongoDB 集合中的一条记录基本上称为文档。文档又包含字段名称和值。
- 字段 (Field) – 文档中的名称-值对。文档可以包含零个或多个字段。字段类似于关系数据库中的列。下图展示了包含键值对的字段示例。在下面的示例中,CustomerID 和 11 是文档中定义的键值对之一。
- JSON – 这被称为 JavaScript 对象表示法。这是一种人类可读的纯文本格式,用于表达结构化数据。JSON 目前在许多编程语言中都得到支持。
关于 _id 字段和普通集合字段之间的主要区别,这里简单说明一下。_id 字段用于唯一标识集合中的文档,并在创建集合时由 MongoDB 自动添加。
为什么使用 MongoDB?
以下是开始使用 MongoDB 的几个原因
- 面向文档——由于 MongoDB 是一种 NoSQL 型数据库,它以文档形式存储数据,而不是采用关系型格式。这使得 MongoDB 非常灵活,能够适应真实的商业情况和需求。
- 即席查询——MongoDB 支持按字段搜索、范围查询和正则表达式搜索。可以创建查询以返回文档中的特定字段。
- 索引——可以创建索引来提高 MongoDB 中搜索的性能。MongoDB 文档中的任何字段都可以被索引。
- 复制——MongoDB 可以通过副本集提供高可用性。副本集由两个或多个 MongoDB 实例组成。副本集中的每个成员都可以随时担任主副本或次副本的角色。主副本是与客户端交互并执行所有读/写操作的主要服务器。次副本通过内置复制维护主副本数据的副本。当主副本发生故障时,副本集会自动切换到次副本,然后次副本成为主服务器。
- 负载均衡——MongoDB 使用分片(sharding)的概念,通过将数据拆分到多个 MongoDB 实例上来水平扩展。MongoDB 可以在多台服务器上运行,实现负载均衡和/或数据复制,以在硬件发生故障时保持系统正常运行。
MongoDB 中的数据建模
正如我们在简介部分所看到的,MongoDB 中的数据具有灵活的模式。与 SQL 数据库不同,在 SQL 数据库中,您必须在插入数据之前声明表的模式,而 MongoDB 的集合不强制文档结构。这种灵活性正是 MongoDB 如此强大的原因。
在 MongoDB 中建模数据时,请牢记以下几点
- 应用程序的需求是什么?——查看应用程序的业务需求,了解应用程序需要哪些数据以及数据类型。基于此,确保相应地决定文档的结构。
- 数据检索模式是什么?——如果您预计查询使用量很大,请考虑在数据模型中使用索引来提高查询效率。
- 数据库是否频繁进行插入、更新和删除操作?——重新考虑索引的使用,或者根据需要在数据建模设计中纳入分片,以提高整个 MongoDB 环境的效率。
MongoDB 与 RDBMS 的区别
以下是 MongoDB 和 RDBMS 之间一些关键术语的区别
RDBMS | MongoDB | 区别 |
---|---|---|
表 | Collection | 在 RDBMS 中,表包含用于存储数据的列和行,而在 MongoDB 中,这种结构称为集合。集合包含文档,文档又包含字段,字段是键值对。 |
行 | 文档 | 在 RDBMS 中,行表示表中的一个单一、隐式结构化的数据项。在 MongoDB 中,数据存储在文档中。 |
列 | 字段 | 在 RDBMS 中,列表示一组数据值。在 MongoDB 中,这些被称为字段。 |
联接 | 嵌入式文档 | 在 RDBMS 中,数据有时会分布在多个表中,为了显示所有数据的完整视图,有时会在表之间形成连接(join)来获取数据。在 MongoDB 中,数据通常存储在单个集合中,但通过使用嵌入式文档进行分隔。因此,MongoDB 中没有连接的概念。 |
除了术语差异外,还有一些其他区别如下所示
- 关系数据库以强制执行数据完整性而闻名。MongoDB 中不强制执行此要求。
- RDBMS 要求先对数据进行规范化,以防止出现孤立记录和重复项。数据规范化 then requires more tables, which will then result in more table joins, thus requiring more keys and indexes.As databases start to grow, performance can start becoming an issue. Again this is not an explicit requirement in MongoDB. MongoDB is flexible and does not need the data to be normalized first.