在本 Node.js 学习路径中,到目前为止,我们已使用关系数据库 SQLite3 作为示例应用程序的数据存储。在本单元中,我们将应用程序转换为使用 MongoDB(这是用于 Node.js 应用程序的最受欢迎的非关系数据库之一)。
MongoDB 是一款开源的文档数据库,并且是业内领先的 NoSQL 数据库,用 C++ 编写而成。 本教程将介绍 MongoDB 的相关概念,从而能够较为深入地了解如何用它来创建并部署具有高度可扩展性,以性能为导向的数据库。 适用人群本教程面向的受众是那些想通过简单易学的步骤来学习 MongoDB 数据库的软件专业人员。本教程能帮助你更好地理解 MongoDB 的相关概念。
正如发布MongoDB 5.0时承诺的更快发布频率,年度大版本MongoDB 6.0也于2022年正式跟广大数据库爱好者们见面了。目前阿里云MongoDB已经完成了对6.0版本的适配工作,大家可以直接在官网控制台进行购买和尝鲜体验!
在如今的互联网环境下,海量数据已随处可见并且还在不断增长,对于如何存储处理海量数据,比较常见的方法有两种:垂直扩展:通过增加单台服务器的配置,例如使用更强悍的 CPU、更大的内存、更大容量的磁盘,此种方法虽然成本很高,但是实现比较简单,维护起来也比较方便。水平扩展:通过使用更多配置一般的服务器来共同承担工作负载,此种方法很灵活,可以根据工作负载的大小动态增减服务器的数量,但是实现比较复杂,得有专门的人员来运维。
GridFS 简介GridFS 是 MongoDB 的一个用来存储/获取大型数据(图像、音频、视频等类型的文件)的规范。它相当于一个存储文件的文件系统,但它的数据存储在 MongoDB 的集合中。GridFS 能存储超过文档尺寸限制(16 MB)的文件。 GridFS 将文件分解成块,将每块数据保存在不同的文档中,每块大小最高为 255 KB。 GridFS 默认使用 fs.files 和 fs.
正则表达式在所有语言当中都是经常会用到的一个功能,可以用来搜索模式或字符串中的单词。MongoDB 也提供了这一功能,使用 $regex 运算符来匹配字符串模式。MongoDB 使用 PCRE(可兼容 Perl 的正则表达式)作为正则表达式语言。 与文本搜索不同,使用正则表达式不需要使用任何配置或命令。 假如 posts 集合有下面这个文档,它包含着帖子文本及其标签。
MongoDB 从 2.4 版本起就开始支持全文索引,以便搜索字符串内容。文本搜索使用字干搜索技术查找字符串字段中的指定词语,丢弃字干停止词(比如 a、an、the等)。迄今为止,MongoDB 支持大约 15 种语言。 启用文本搜索最初的文本搜索只是一种试验性功能,但从 2.6 版本起就成为默认功能了。但如果使用的是之前的 MongoDB,则需要使用下列代码启用文本搜索: >db.
前面的几章中都涉及到了 MongoDB 的对象 id。本章将介绍 ObjectId 的结构。 ObjectId 是一个 12 字节的 BSON 类型,其结构如下: 前 4 个字节代表 UNIX 的时间戳(以秒计)。 接下来的 3 个字节代表机器标识符。 接下来的 2 个字节代表进程 id。 最后 3 个字节代表随机数。 MongoDB 使用 ObjectId 作为每一文档的 _id 字段的默认值(在创建文档时产生)。
MongoDB 并不支持多文档原子事务(multi-document atomic transactions)。但它提供了针对单个文档的原子操作。假如一个文档包含数百个字段,则 update 语句将更新所有的字段,或者一个也不更新,从而维持了文档级的原子性。 原子操作数据模型维持原子性的建议方法是利用内嵌文档(embedded document)将所有经常更新的相关信息都保存在一个文档中。
MongoDB 中的关系表示文档之间的逻辑相关方式。关系可以通过内嵌(Embedded)或引用(Referenced)两种方式建模。这样的关系可能是 1:1、1:N、N:1,也有可能是 N:N。 先来考虑保存用户地址的例子。一个用户可能有多个地址,这是一个 1:N 的关系。 下面是一个结构非常简单的 user 文档。
要想在 MongoDB 上使用 PHP,需要使用 mongodb PHP 驱动。从该链接处下载 PHP 驱动。确保下载的是最新版。将其解压缩,并将 php_mongo.dll 文件放到 PHP 扩展目录中(默认为 “ext”),然后把下列代码放到 php.ini 文件中: extension=php_mongo.dll 创建连接并选择数据库创建连接需要指定数据库名称,如果数据库不存在,则 mongodb 会自动创建它。
安装要想在 Java 程序中使用 MongoDB,需要先确定是否安装了 MongoDB JDBC 驱动,并且要在机器上安装了 Java。查看 Java 教程来确保在机器上安装好 Java。下面来介绍如何安装 MongoDB JDBC 驱动。 从路径 Download mongo.jar 处下载 jar 文件,注意下载最新版本。 在类路径中包括 mongo.jar 文件。
在准备一个 MongoDB 部署时,应该先了解一下应用是如何在生产环境中运行的。使用一个持久性可重复的策略来管理部署环境无疑是很有用的,它将减少你在生产环境中遇到意外麻烦的可能性。最佳的策略应包括以下几点:规划设置原型,执行负载测试,监控关键参数,并使用该信息来扩展设置。
分片是一种在多台机器上存储数据记录的操作,它是 MongoDB 为应对数据增长需求而采取的办法。当数据量增长时,单台机器有可能无法存储数据或可接受的读取写入吞吐量。通过横向扩展,分片技术解决了这个问题。利用分片技术,我们可以添加更多的机器来应对数据量增加以及读写操作的要求。
复制是一种在多个服务器上同步数据的过程。通过在不同的数据库服务器上实现多个数据副本,复制能够实现数据冗余,提高数据的可用性,从而避免了仅仅因为一台服务器故障后就会产生的数据库灾难。总之,复制可以使你免受硬件故障与服务中断的影响,及时恢复数据。由于数据有多个副本,所以可以将其中一个副本用于灾难恢复、报告或备份。
聚合操作能够处理数据记录并返回计算结果。聚合操作能将多个文档中的值组合起来,对成组数据执行各种操作,返回单一的结果。它相当于 SQL 中的 count(*) 组合 group by。 aggregate() 方法对于 MongoDB 中的聚合操作,应该使用 aggregate() 方法。 语法格式aggregate() 方法中的基本格式如下所示: >db.COLLECTION_NAME.
索引能够实现高效地查询。没有索引,MongoDB 就必须扫描集合中的所有文档,才能找到匹配查询语句的文档。这种扫描毫无效率可言,需要处理大量的数据。 索引是一种特殊的数据结构,将一小块数据集保存为容易遍历的形式。索引能够存储某种特殊字段或字段集的值,并按照索引指定的方式将字段值进行排序。
在 MongoDB 中,映射(Projection)指的是只选择文档中的必要数据,而非全部数据。如果文档有 5 个字段,而你只需要显示 3 个,则只需选择 3 个字段即可。find() 方法MongoDB 的查询文档曾介绍过 find() 方法,它可以利用 AND 或 OR 条件来获取想要的字段列表。在 MongoDB 中执行 find() 方法时,显示的是一个文档的所有字段。要想限制,可以利用 0 或 1 来设置字段列表。
MongoDB 支持如下数据类型: String:字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 Integer:整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 Boolean:布尔值。用于存储布尔值(真/假)。 Double:双精度浮点值。用于存储浮点值。
MongoDB 中的数据模式非常灵活。同一集合中的文档不需要具有同一字段或结构,集合文档的公用字段可能包含不同类型的数据。 设计 MongDB 模式时应注意的问题根据用户需求来设计模式。 如果想一起使用对象,请将这些对象合并到一个文档中,否则要将它们分开(但是要确保不需要连接)。 经常复制数据(但要有一定限度),因为与计算时间相比,硬盘空间显得非常便宜。
关注时代Java