MongoDB 教程

MongoDB 是一个面向文档的 NoSQL 数据库,用于大容量数据存储。在本教程中,你将学习如何访问 Mongodb 以及它的一些重要功能,如索引,正则表达式,分片数据等。

MongoDB 是一个在 2000 年代中期出现的数据库。它属于 NoSQL 数据库的范畴。

什么是 MongoDB

  1. MongoDB 是一个文档数据库。每个数据库都包含集合,而集合又包含文档。每个文档可以具有不同数量的字段。每个文档的大小和内容可以彼此不同。
  2. 文档结构更符合开发人员在各自的编程语言中构建类和对象的方式。开发人员经常会说他们的类不是行和列,而是具有键值对的清晰结构。
  3. 如 NoSQL 数据库的介绍中所示,行(或 MongoDB 中所说的文档)不需要事先定义模式。相反,可以动态创建字段。
  4. MongoDB 中可用的数据模型允许你更轻松地表示层次关系,存储数组和其他更复杂的结构。
  5. 可伸缩性 - MongoDB 环境具有很高的可扩展性。世界各地的公司都定义了集群,其中一些集群运行着 100 多个节点,数据库中有大约数百万个文档

下面的示例显示了如何在 MongoDB 中建模文档。

  1. MongoDB 添加了_id 字段,以唯一标识集合中的文档。
  2. 你可以注意到,RDBMS 中的订单数据(订单 ID、产品和数量)通常存储在单独的表中,而在 MongoDB 中,它实际上作为嵌入文档存储在集合本身中。这是 MongoDB 中数据建模方式的主要区别之一。
{
    _id : <objectId> ,
    CustomerName : Guru99 ,
    Order:
    		{
    			OrderID: 111 
    			Product: ProductA 
    			Quantity: 5
    		}
}

NoSQL 意味着什么

NoSQL 不是关系数据库。它提供了更大的灵活性,因为所有记录都不受整个表中定义的相同列名和类型的限制。下面的例子将更好地了解 NoSQL 是什么。

以下 2 个表是 Customer 表和 Order 表的简单示例,其中 Customer 表通过关系链接到 Order 表。

  • 客户表
客户 ID 客户名称 订单 ID
11 Tastones 111
22 特雷弗史密斯 222
33 妮可 333
  • 订单表
订单 ID 产品 数量
111 ProductA 5
222 ProductB 8
333 ProductC 10

在 NoSQL 中,表可能看起来像下面所示的表

  • 客户表
CustomerID 11 CustomerName Guru99 OrderID 111 City US
CustomerID 22 CustomerName Trevor Smith OrderID 222 Status Privilege
CustomerID 33 CustomerName Nicole OrderID 333 Status Privilege
  • 订单表
OrderID 111 Product ProductA Quantity 5 Shipment Date 22-Mar-15
OrderID 222 Product ProductB Quantity 8
OrderID 333 Product ProductC Quantity 10
  1. 你将立即注意到的第一件事是你没有定义特殊列名的列,而是每个字段都有一个键值对。
  2. 你会注意到在客户的表中,前 3 个键对于所有 3 行是相同的,但第 4 个键(City 和 Status)对于前 2 行是不同的,不适用于第 3 行。
  3. 同样,在 Orders 表中,第 2 行和第 3 行没有为 4 列(装运日期)定义的值。

这就是 NoSQL 如此特殊和独特,也非常灵活的原因。在我们充满活力且不断变化的技术世界中,企业主现在需要更快的软件解决方案周转时间。

通过使用 NoSQL 数据库等灵活的数据库,我们可以灌输更快的周转时间,因为我们在定义数据的方式上具有更大的灵活性和更少的约束。

想象一下,在为关系数据库中的现有表添加或编辑列所花费的时间与在 NoSQL 数据库中添加相同数量所需的工作量相比。

MongoDB 中的常用术语

以下是 MongoDB 中使用的一些常用术语

  1. _id - 这是每个 MongoDB 文档中都需要的字段。 _id 字段表示 MongoDB 文档中的唯一值。 _id 字段就像文档的主键。如果你创建一个没有_id 字段的新文档,MongoDB 将自动创建该字段。因此,例如,如果我们看到上述客户表的示例,Mongo DB 将为集合中的每个文档添加一个 24 位唯一标识符。
_Id 客户 ID 客户名称 订单 ID
563479cc8a8a4246bd27d784 11 Tastones 111
563479cc7a8a4246bd47d784 22 特雷弗史密斯 222
563479cc9a8a4246bd57d784 33 妮可 333
  1. Collection - 这是一组 MongoDB 文档。集合相当于在任何其他 RDMS(如 Oracle 或 MS SQL)中创建的表。集合存在于单个数据库中。从引言集中看,不强制执行任何类型的结构。

  2. Cursor - 这是一个指向查询结果集的指针。客户端可以遍历游标以检索结果。

  3. 数据库 - 这是 RDMS 中的集合的容器,其中它是表的容器。每个数据库都在文件系统上获得自己的一组文件。MongoDB 服务器可以存储多个数据库。

  4. 文档 - MongoDB 集合中的记录基本上称为文档。该文档又由字段名称和值组成。

  5. 字段 - 文档中的名称 - 值对。文档包含零个或多个字段。字段类似于关系数据库中的列。

  6. JSON - 这被称为 JavaScript 对象表示法。这是一种用于表达结构化数据的人类可读的纯文本格式。许多编程语言目前支持 JSON。

我们再强调一遍,_id 字段与普通集合字段之间的主要区别。 _id 字段用于唯一标识集合中的文档,并在创建集合时由 MongoDB 自动添加。

为什么要使用 MongoDB

以下是为什么应该开始使用 MongoDB 的几个原因

  1. 面向文档 - 由于 MongoDB 是 NoSQL 类型的数据库,它不是以关系类型格式存储数据,而是将数据存储在文档中。这使得 MongoDB 非常灵活,能够适应真实的商业环境和要求。
  2. 即席查询 - MongoDB 支持按字段,范围查询和正则表达式搜索进行搜索。可以进行查询以返回文档中的特定字段。
  3. 索引 - 可以创建索引以提高 MongoDB 中的搜索性能。可以索引 MongoDB 文档中的任何字段。
  4. 复制 - MongoDB 可以为副本集提供高可用性。副本集由两个或多个 mongo 数据库实例组成。每个副本集成员可以随时以主副本副本的角色运行。主副本是主服务器,它与客户端交互并执行所有读/写操作。辅助副本使用内置复制维护主数据的副本。当主副本失败时,副本集会自动切换到辅助副本,然后它将成为主服务器。
  5. 负载平衡 - MongoDB 使用分片的概念通过在多个 MongoDB 实例之间拆分数据来水平扩展。MongoDB 可以运行在多个服务器上,平衡负载和/或复制数据,以便在硬件发生故障时保持系统正常运行。

数据建模

正如我们在 简介 部分中看到的那样,MongoDB 中的数据具有灵活的模式。与[SQL](/ sql.html)数据库不同,在插入数据之前必须先声明表的模式,MongoDB 的集合不会强制执行文档结构。这种灵活性使 MongoDB 如此强大。

在 Mongo 中建模数据时,请记住以下事项

  1. 应用程序的需求是什么 - 查看应用程序的业务需求,并查看应用程序所需的数据和数据类型。在此基础上,确保相应地确定文档的结构。
  2. 什么是数据检索模式 - 如果你预见到查询使用量很大,那么请考虑在数据模型中使用索引来提高查询效率。
  3. 数据库中是否经常发生插入,更新和删除 - 如果数据建模设计需要,请重新考虑使用索引或合并分片,以提高整个 MongoDB 环境的效率。

MongoDB 和 RDBMS 之间的区别

以下是 MongoDB 和 RDBMS 之间的一些关键术语差异

RDBMS MongoDB 的 区别
采集 在 RDBMS 中,表包含用于存储数据的列和行,而在 MongoDB 中,这种结构称为集合。该集合包含文档,而文档又包含字段,而字段又是键值对。
文件 在 RDBMS 中,该行表示表中的单个隐式结构化数据项。在 MongoDB 中,数据存储在文档中。
领域 在 RDBMS 中,列表示一组数据值。MongoDB 中的这些被称为 Fields。
加盟 嵌入式文件 在 RDBMS 中,数据有时会分布在各种表中,为了显示所有数据的完整视图,有时会在表之间形成连接以获取数据。在 MongoDB 中,数据通常存储在单个集合中,但使用嵌入式文档分隔。所以在 Mongodb 中没有连接的概念。

除了术语差异外,下面还显示了一些其他差异

  1. 已知关系数据库用于实施数据完整性。这不是 MongoDB 中的明确要求。

  2. RDBMS 首先要求数据被规范化,以便它可以防止孤立记录和重复规范化数据然后需要更多的表,这将导致更多的表连接,因此需要更多键和索引。

随着数据库开始增长,性能可能开始成为一个问题。同样,这不是 MongoDB 中的明确要求。MongoDB 非常灵活,不需要首先对数据进行规范化。