2.1 数据模型
MongoDB是一个基于文档的数据库系统,其中有文档可以有一个灵活的模式。这意味着集合中的文档可以有不同(或相同)集的字段。这在处理数据时提供了更大的灵活性
在本章中,您将探索MongoDB的灵活数据模型。哪里有需要,我们将与RDBMS系统相比,演示了这种方法的区别。
MongoDB部署可以有许多数据库。每个数据库都是一组集合。集合类似于SQL中的表的概念;然而,他们是无模式。每个集合都可以有多个文档。可以将文档看作是SQL中的一行。图4-1描述了MongoDB数据库模型。
在RDBMS系统中,因为每个列的表结构和数据类型都是固定的,所以可以只在列中添加特定数据类型的数据。在MongoDB中,集合是文档的集合将数据存储为键-值对。
让我们以一个示例来理解数据是如何存储在文档中的。下面的文档包含以下内容用户的姓名和电话号码:
动态模式意味着同一集合中的文档可以具有相同或不同的集合在字段或结构中,甚至公共字段都可以在文档中存储不同类型的值。有数据存储在一个集合的文档中的方式是不严格的。
因此,一个集合的文档可以有完全不同的模式。它会落到应用程序来存储一个特定集合中的文档或多个集合。
2.2.1 JSON和BSON
MongoDB是一个基于文档的数据库。它使用二进制JSON存储数据。
在本节中,您将了解JSON和二进制-JSON(BSON)。JSON代表JavaScript对象符号。在当今的现代Web(以及XML)中,它是用于数据交换的标准。的格式是人类和机器可读的。这不仅是交换数据的好方法,也是存储数据的好方法。
所有的基本数据类型(例如字符串、数字、布尔值和数组)都是由JSON支持的。
下面的代码显示了JSON文档的样子:
JSON使您可以将所有相关的信息集中在一个地方,这提供了优秀的信息的性能。它还使文档的更新成为独立的。它是无模式。
MongoDB以二进制编码的格式存储JSON文档。这被称为“BSON”。BSON数据模型是JSON数据模型的扩展形式。MongoDB的一个BSON文档的实现是快速的、可实现的,并且是轻量级的。它支持在其他数组中嵌入数组和对象,并允许MongoDB进入对象内部在顶级和嵌套的BSON键上构建索引并匹配对象。
2.2.2 标识符(_id)
您已经看到MongoDB将数据存储在文档中。文档是由键值对组成的。尽管可以将文档与RDBMS中的一行进行比较,但与一行不同,文档具有灵活的模式。一个键,它仅仅是一个标签,可以粗略地与RDBMS中的列名相比较。使用一个关键用于从文档中查询数据。因此,就像RDBMS主键(用于惟一地标识每个键行),您需要有一个键,它惟一地标识一个集合中的每个文档。这被称为在MongoDB _id。
如果您没有显式地为键指定任何值,那么将自动生成一个惟一的值并由MongoDB分配给它。这个键值是不可变的,除了数组之外,它可以是任何数据类型。
2.2.3 固定集合
您现在已经精通了集合和文档。让我们来讨论一种特殊的集合叫做a限制收集
MongoDB有一个限制集合的概念。这意味着它将文档存储在集合中在插入的顺序。当集合达到其极限时,文档将从集合中删除。在FIFO(首先是,先出)订单。这意味着,最近插入的文档将首先被删除。
这对于需要自动维护插入顺序的用例来说是很好的,并且需要在固定大小的情况下删除记录。一个这样的用例是自动生成的日志文件在一定大小后截断。
2.3 多态模式
由于您已经熟悉MongoDB数据结构的无模式特性,现在让我们来探索一下多态模式和用例。
多态模式是一个模式,其中一个集合拥有不同类型或模式的文档。这个模式的一个很好的例子是一个名为Users的集合。一些用户文档可能会有额外的传真数字或电子邮件地址,而其他人可能只有电话号码,但所有这些文档都是共存的在相同的用户集合中。这个模式通常被称为多态模式。
2.3.1 面向对象编程
面向对象编程使您可以使用继承来让类共享数据和行为。它还允许在父类中定义函数,这些函数可以在子类中被覆盖,这样就可以在不同的环境下,函数是不同的。换句话说,您可以使用相同的函数名来操作除了父类,子元素和父类都是不同的。这特性被称为多态性。
在本例中,需求是具有一个模式,其中包括所有相关的对象集合层次结构中的对象可以组合在一起,也可以被相同的检索。
让我们考虑一个例子。假设您有一个允许用户上传和共享的应用程序不同的内容类型,如HTML页面、文档、图像、视频等等。在上述所有内容类型中都是常见的(例如名称、ID、作者、上传日期,以及时间),不是所有的字段都是相同的。例如,在图像的情况下,你有一个二进制字段图像内容,而HTML页面有一个大的文本字段来存放HTML内容。
在此场景中,可以使用MongoDB多态模式,其中所有内容节点类型都可以使用存储在相同的集合中,例如LoadContent,并且每个文档只有相关的字段。
这个模式不仅允许您将具有不同结构的相关数据存储在相同的结构中集合,它也简化了查询。相同的集合可以用于执行常见的查询诸如获取某个特定日期和时间上上传到的所有内容以及特定字段的查询等字段例如查找大小大于X MB的图像。因此,面向对象编程是拥有多态模式的用例之一。是有意义的。
2.3.2 模式演化
当您使用数据库时,您需要考虑的最重要的考虑事项之一因为模式的演化(例如,模式对正在运行的应用程序的影响)。设计应该在某种程度上对应用程序进行最小或不影响,这意味着没有或最小限度停机时间、不或非常小的代码更改等等。
通常情况下,模式演化是通过执行一个迁移脚本来实现的,该脚本将数据库模式从旧版本升级到新版本。如果数据库不在生产环境中,脚本可以简单地删除和重新使用数据库。但是,如果数据库位于生产环境中,并且包含实时数据,那么迁移脚本将是复杂的,因为需要保存数据。脚本应该考虑这个问题。尽管MongoDB提供了一个更新选项,可用于更新集合中的所有文档结构,如果有一个字段的新添加,请想象如果在集合中有数千个文档,那么做这件事的影响。它将非常缓慢,并且会对底层应用程序的性能产生负面影响。这样做的一种方法是将新结构添加到新文档中,并将这些文档添加到集合中,然后在应用程序仍在运行时逐渐将其迁移到后台。这是许多用例中的一个,其中多态模式将是有利的。
- 下面我们通过以下几点来深入学习并熟练使用MongoDB数据库:
Windows下MongoDB—安装与配置
运行MongoDB以及服务的配置
MongoDB工具
MongoDB Shell
使用身份验证和授权
MongoDB架构(1.mongod,2.mongo,3.mongos)
管理MongoDB 备份和恢复 导入和导出