如何用MongoDB来进行开发

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 如何用MongoDB来进行开发

五天玩转MongoDB训练营:如何用MongoDB来进行开发

课程地址:https://developer.aliyun.com/trainingcamp/83fa92f8ecf2498d9e31296738b7d706?spm=a2cwt.28237621.J_9603273760.7.31b2b726xTbsZG

如何用MongoDB来进行开发

 

内容介绍

一、 利用MOngoDB搭建网站

二、 为什么使用MongoDB数据库

三、 如何使用副本集形态

四、 如何使用分片集群形态

 

一、利用MOngoDB搭建网站

在这次操作中,我们将使用Python框架和我们的集群来展示如何构建一个完整的应用程序。今天的步骤可以分为四个部分。首先,我们的目标是利用MongoDB创建一个UFO记录观测数据的网站,用户可以在网站上查看最终结果的截图。
image.png

在这个网站上,我们实际上获取了一个公共数据集,其中包含观测记录。用户可以在网站上根据他们所在的城市和美国的州来查找过去20年的UFO的观测记录。另外,第二个功能允许终端用户提交新的UFO观测记录。简而言之,这个应用程序的主要功能是查询数据库中的记录并进行呈现,以及在终端应用程序的表单上提交新记录并将其写入数据库。

整个实验可以分为四个主要步骤。首先,我们需要准备公共数据集,您可以在网站上找到并下载它。

第二步,我们将准备数据库和表,并将下载的数据导入其中。

第三步,我们提供了GitHub源代码,您可以直接下载并构建环境。最后,根据您的数据集群配置,修改数据库连接字符串并运行应用程序,配置环境后,您就可以体验这个应用程序了。

接下来,让我们直接进入实验环节。首先,我们需要在开放的网站上下载所需的公共数据集。可以在该网站上找到有关UFO数据集的下载链接,已经下载好了这个数据集。
image.png
第二步,我们需要打开图形化的IDE,它是于MongoDB的一个工具,您也可以在官方网站上下载。

image.png

 

打开后,我们可以在这里添加一个新的连接,并将我们已经创建的数据库集群的连接字符串粘贴在这里。已经保存了相关的数据库连接字符串。您可以根据需要灵活更改数据库集群的字符串,并在这里提供临时用户名和密码。

 

image.png

 

一旦这些连接字符串设置好,我们就可以连接到我们的MongoDB数据库集群,现在,我们已经成功连接到了这个集群。
image.png

 

默认情况下,我们的空白集群没有任何数据库或表,因此我们需要在这个空白的集群上创建一个新的数据库,我们将其命名为'ufo'。在这个数据库下,我们创建了一张同名的表。如您所见,我们的库和表已经创建成功,但里面没有任何数据。接下来,我们将使用这个UFO来导入刚刚下载的观测记录数据。

image.png

 

我们可以点击这里,在这个界面上,我们可以选择我们刚刚下载的观测记录数据源,并指定相应的字段类型。通常情况下,我们的数据以逗号作为分隔符,这也是默认设置。在底部,您可以预览到我们的数据分布,包括每次观测的时间,城市所属的州,国家,观测的形状,持续时间以及观测者的评论记录。

image.png

 

此外,我们还可以了解到每个观测记录的发布日期以及位置的行为度,有了这个数据集,我们就可以点击此处,开始导入数据。

 

image.png

 

与此同时,我们还可以准备要使用的应用程序源代码。

这次实验的源代码可以在 GitHub 上找到。我们可以将源代码下载到本地,并创建一个本地目录以保存它。如您所见,我已经成功下载了这套源代码。

image.png

现在我们可以看到整个数据集已经成功导入。在这个阶段,您可以通过执行一些初步的数据探索、查询或修改操作来对数据进行进一步的操作。如您所见,总共有88个文档,并且默认情况下存在一个默认索引,通常基于'id'字段。

 

image.png

 

接下来,我们可以开始构建整个应用程序。我们将回到源代码部分。

 

image.png

 

打开源代码后,您会看到这是一个基于 Flask 框架的标准 Python 应用程序。我们有一些静态文件和 HTML 模板在'templates'文件夹中,但核心的 Python 服务应用程序是'app.py'文件。

在实际开始调整代码并构建应用程序之前,我们需要安装所有必要的依赖包。这些依赖包都列在'requirements.txt'文件中。您可以使用以下命令来安装它们:

Copy code

pip install -r requirements.txt

所有的依赖包都已经安装完毕。接下来,我们可以运行应用程序。在运行应用程序之前,我们需要更深入地了解代码,并确保它可以连接到我们的后端数据库。

image.png

 

首先,让我们深入研究 HTML 文件。在这些文件中,最重要的界面入口是 'index.html' 文件,这个文件主要做了以下几件事情

首先,我们引用了一个 CSS 样式表,以及我们将在上面构建的 Flask 网站的格式。在文件中,我们有一个 'title' 标签,用于定义网站的标题。
接下来,我们有两个导航按钮。第一个是主页的导航按钮,用于导航回网站的首页。第二个是我们刚刚看到的,它允许我们根据选择的城市和州来查看所有相关的观测记录。还有一个导航,允许用户跳转到提交页面,以便用户可以通过该页面提交新的观测记录。

这是初始化页面的内容。在初始化页面上,我们会进入 'content' 部分。这个部分是关于第一个页面的,它将根据我们输入的城市和州,呈现出所有相关的历史观测记录。

这个 HTML 页面实际上是我们的前端界面。在核心部分,我们放置了一个用户输入表单,用户可以在这里输入城市的名称并选择对应的周。然后,他们可以点击按钮,当用户选择城市和周后,我们将通过 'Submit' 按钮向后端提交查询请求。这个查询请求将由我们的 Python 后端来处理。

在转到 Python 之前,让我们先看一下 'app.py' 文件。在这个文件中,我们首先需要将连接字符串替换为我们的实际连接字符串。我们将获取连接字符串并在这部分进行替换。

接下来,我们定义了两个函数,以便我们可以在 Python 中调用它们。其中之一是 'get_count',它需要前端用户传入城市和周,并返回相应的观测记录数量。我们实际上是在这里使用了 MongoDB 的聚合框架。我们首先进行了城市的过滤,然后是周的过滤,并最后计算数量。

另一个函数是 'get_data',同样需要城市和州作为参数。在进行相同的城市和州过滤后,我们将呈现所有观测记录,并将数据集返回给前端。这个函数实际上是将数据集包装为 JSON 格式。

回到 Python,我们进行了更详细的变量处理和数据清理。

首先,我们获取了数据库并将其存储在 'db' 变量中,然后获取了表格并存储在 'table' 变量中。

接着,我们创建了一个空数组 'columns' 来存储表格的列名。在这个函数的第一部分,我们根据用户输入的状态来决定要查询和展示所有观测记录。在这里,我们检查前端提交的 'ct' 参数,对其进行异常值处理。如果 'ct' 不是正常的字符串状态,我们将返回一个错误页面。否则,我们将 'ct' 转换为小写。

然后,我们获取了属于该城市和状态的所有观测记录的数量。我们直接调用了 'get_count' 函数,传递了 'c' 和 'state' 来获得观测记录数量。

接下来,我们获取了属于该城市和州的观测记录的详细列表,并将其返回到前端。这里我们调用了 'get_data' 函数,并传递了 'c' 和 'state' 作为参数。

对于提交部分,当用户访问 'submit.html' 页面时,我们可以看到该页面包含一个表单,允许用户输入城市、州、经纬度、时长、形状和描述。用户在静态页面中输入这些值后,我们在后端获取了这些输入值并在 'app.py' 文件中处理它们。

在 'app.py' 文件中,我们首先定义了一个路由,该路由处理 POST 请求,并接收用户输入的数据。然后,我们将这些输入值作为参数传递给处理函数 'submit'。在 'submit' 函数中,我们获取并存储了用户输入的城市、州、经纬度、时长、形状和描述在用户终端输入。

image.png

 

在 'app.py' 中,我们首先获取前端表单的所有字段,并将它们存储在一个空字典中。然后,我们将这些字段分别赋值给对应的变量,并进行一些数据类型的转换,例如将日期字段转换为 Python 的日期时间类型,以便更容易在数据库中存储。我们还进行了异常处理,以确保输入的数据是有效的。

 

image.png

 

接下来,我们使用一个函数来将这些字段插入到数据库中,并最后返回一个静态页面作为响应。这个页面将用户输入的数据返回给用户。

整个应用程序的逻辑非常清晰简单,主要的调整点在于 Python 文件和数据库的交互。完成这些调整后,我们就可以运行 'app.py' 文件来启动应用程序。

image.png

 

现在,我们可以在浏览器中体验应用程序。请注意,我们有两个主要功能:一个是“查看历史记录”,另一个是“提交观测记录”。举个例子,如果我们想查询西雅图(WA)的历史观测记录,我们可以轻松实现。整个周共有13条观测记录,其中有8个城市。所有这些记录都与西雅图相关。

而当我们需要提交新的观测记录时,例如在西雅图进行一次新的观测,您可以随意估计经纬度。

image.png

 

观测的时间大约为120到两分钟。对应的形状是正方形,日期选择为今天。我们随便填写一些内容,然后进行提交。接着,我们可以在数据库中进行查询,验证数据是否已成功提交。在这里,我们可以进行一些过滤和查询操作,例如,查询城市为西雅图的记录。您可以看到这些记录中包括我们刚刚提交的一条记录,日期为5月15日。当然,我们也可以从前端进一步验证,我们的记录已成功提交并能够在前端页面上展示出来。这条记录正是我们刚刚提交的。好的,至此,我们的应用操作结束。

通过这个简单的应用,您可以学到如何将公共数据集加载到您的数据库和集群中,以及如何使用Python和Flask框架构建一个完整的终端应用。

接下来,有关如何使用Python Flask构建应用程序的部分到这里就结束了.


二、为什么使用MongoDB数据库

接下来,让我们欢迎阿里云数据库内核开发工程师,他将与我们分享副本集和分片集群在生产系统中的运维经验。

迎加入本次课程来自阿里云数据库。在本堂课中,我们将主要介绍Mongo数据库中两种经典架构——副本集和分片集群,以及在生产业务系统中的运维经验。

这将有助于大家更快地掌握相关应用的开发。我将开始本期课程,将内容分为四部分:首先,为什么要使用Mongo数据库?其次,如何使用它?然后,如何更好地使用它?最后,我将分享一些在开发初期可能遇到的主要问题和一些运维操作。首先,让我们探讨为什么要使用Mongo数据库。

Mongo数据库的最大优势之一是其非结构化特性,即Schema Free。这意味着您无需提前定义表结构,可以轻松地添加字段。此外,Mongo数据库支持文档的多层嵌套,因此对于需要存储多层次数据的行业,如游戏和车联网,非常友好。其次,Mongo数据库具有出色的性能,可以满足大多数客户的需求。Mongo数据库主要与内存进行交互,在高并发的读写场景下,无论是响应时间还是吞吐量,性能都表现出色。

最后是Mongo数据库本身具有繁荣的社区生态系统。无论是官方论坛还是社区社交平台,都一直保持着活跃的状态,为初学者提供了宝贵的学习和使用数据库的机会。阿里云Mongo数据库现在提供多种不同形态的产品,包括单节点、共享存储、副本集和分片集群。

单节点版本主要用于测试和开发目的,不建议在生产核心业务中使用。共享存储版本基于共享存储硬盘的高性能高性价比架构,主要面向价格敏感型客户。

 

image.png

 

副本集采用一主一从的硬件架构,主要确保了极高的可用性。分片集群通过数据分片和负载均衡,将请求分发到底层节点的一套工作流程,主要应对高并发场景。副本集和分片集群是Mongo数据库中两种最经典的部署方式,本课程的重点也在于介绍这两种架构的使用。

首先,让我们来讨论如何使用副本集形态。我们以Java语言和Spring Boot框架为例。首先,在项目的pom.xml文件中引入核心依赖Spring Boot。这是一个示例项目配置,它将自动引入一些必需的基础依赖项,包括Spring、Spring Data、MongoDB等等。

 

image.png

 

在本示例中,我们还需要其他一些依赖项,例如日志记录等等。

下一步是配置数据库连接,我们可以在配置文件中使用Spring Boot定义连接串信息。阿里云数据库也提供了高可用的连接地址。如果使用单点连接地址的话,当发生内核切换时,可能会导致无法连接或写入的问题。阿里云提供的连接串是基于A库下定义的,使用A库的账号进行认证,默认情况下会进入Admin库。如果您想要进入其他自定义的库,可以直接配置连接串。

例如,如果想要默认进入Test库,但仍然使用Admin库的账号进行认证,您可以使用实例中的第二种方式。


三、如何使用副本集形态

image.png

接下来,我们定义了一些简单的数据对象,使用子类来模拟业务数据存储,包括ID、姓名、年龄和性别,同时使用值定义了它们对应的集合名称。如果需要使用事务,只需定义一个配置类,默认返回Spring中定义的Transaction即可。接下来,让我们学习一下如何通过代码进行数据库操作,一般有两种方式。

 

image.png

第一种方式是通过注入MongoTemplate来调用,MongoTemplate提供了许多线程安全的方法,包括CRUD等。

下面提供了一些具体的例子,如save函数,它可以直接进行保存操作。

 

findOne函数类似于查询操作,如果记录存在则返回,如果不存在则插入。exists函数通过存在注解来使用事务,在模拟出错的情况下,您会发现这条数据实际上没有插入到数据库中,事务成功进行了回滚。aggregate函数使用Aggregation类来定义参数,并直接调用template的aggregate函数进行聚合。在示例中,我们统计了男性用户的平均年龄。

image.png

 

接下来,我们编写了一些基本的单元测试来模拟实际数据调用上述实现的函数。在统计年龄时,我们数据库中总共有三条数据,其中两个男性分别是20岁和19岁,一个女性是20岁。我们得到的结果应该是男性的平均年龄是19.5岁。单元测试的结果与直接执行原生MongoDB命令得到的结果一致。

此外,还介绍了另一种方式,通过继承MongoRepository类,我们可以使用父类自带的函数,也可以通过注解使用类似原生命令的方式来自定义接口。在示例中,我们统计了年龄在十岁以上的男性和女性的总数。这里age是我们的传入参数。同样,我们编写了一些基本的单元测试,用于测试调用一些父类函数进行插入、查找和聚合操作。最终得到的结果是符合预期的,男性两位,女性一位。

最后,如果使用分片集群,与副本集相比,分片集群的运维可能会更加复杂一些。

 

四、如何使用分片集群形态

 

image.png

在深入使用分片集群之前,我们需要对分片集群的基本概念有一定的了解。在实际使用阶段,可以通过MongoDB控制台执行以下命令:

首先,使用MongoDB的sharding功能对自定义的库启用分片。

然后,创建分片键对应的索引,因为用作分片键的字段上必须要有相应的索引,否则无法对集合进行分片。

接下来,对特定集合进行分片和定义分片键。我们还可以通过增加分片选项来自定义分片的数量,提前进行预分片,以防止业务运行中频繁进行分片切分。

最后,为了防止分片对资源的占用以及对业务的影响,可以设置窗口限制其活跃时间,只允许在业务低峰期才可以进行分片数据均衡。在示例中,将目标窗口的时间配置为凌晨两点到五点才允许执行分片操作。

此外,正确的预警非常重要。首先,需要密切关注实例的监控指标,包括CPU、内存、连接数等的消耗情况,以及存储引擎缓存的命中率等。默认情况下,当命中率达到20%时,将使用用户线程进行审查,直到命中率下降到5%以下。还需要注意连接数,如果达到128个用光,可能导致请求堆积,这表明请求量超过了实例的处理能力。此外,主从节点之间的延迟情况也需要关注,如果主节点写入过快,从节点无法跟上,可能会导致复制延迟。为了应对这种情况,可以通过限制主节点的写入速度来减缓从节点的压力。最后,监控磁盘使用情况也很重要,在阿里云MongoDB中,磁盘使用率达到95%以上时,会触发磁盘告警,实例会进入制毒状态。因此,及时关注这些监控指标,并配置相应的云监控报警,可以有效提升阿里云MongoDB的性能和稳定性。

然而,监控指标有时只能反映表面现象,无法揭示底层根本原因。例如,高CPU和OPS可能是因为查询不正确或者直接进行全表扫描导致的。因此,如何建立和优化索引是一个非常关键的问题。我们建议遵循以下三个原则:

首先,遵循“等值排序非等值简化”的原则来选择字段的顺序,以满足等值和排序等查询的需求。

第二,对于非等值查询,最常用的字段应该优先走索引。

第三,对于复杂的查询,建议将其拆分成多个简单的查询,并为每个部分建立相应的索引。

image.png

让我们以一个查询为例,该查询包含一个等值查询和两个非等值查询,还有一个排序字段。根据前面提到的原则,我们可以首先针对等值查询字段建立索引,然后再针对非等值查询字段建立索引。当然,这些建议适用于大多数情况。因为查询的复杂性会因情况而异,所以在建立索引时需要根据具体情况来选择。

此外,对于连接池参数的配置,这包括客户端到服务器的连接串参数以及在建立连接时可以选择的参数。其中前6个参数是与客户端连接服务器相关的,包括连接数量的上限、下限以及连接的超时时间。而后面的4个参数是关于内部连接池的,用于限制内部连接池的大小。因为MongoDB服务端可能会被多个客户端同时访问,所以需要合理地调整每个客户端上的连接数,以降低整体数据库的压力。过多的连接可能会导致不可访问的状态或内存使用率过高。
因为每个连接都需要保存一些上下文信息,所以连接越多,内存消耗就越大。因此,一个良好的经验法则是不要为每个客户端都创建一个新的连接,这将减轻数据库的连接数和内存压力。

 

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
2月前
|
存储 人工智能 NoSQL
使用 MongoDB 构建 AI:Gradient Accelerator Block 如何在几秒钟内让您从零开发 AI
借助 MongoDB,开发者可以存储任何结构的数据,然后使用单一查询 API 和驱动程序将这些数据用于 OLTP、文本搜索和向量搜索处理。
|
4月前
|
开发框架 NoSQL 关系型数据库
基于SqlSugar的开发框架循序渐进介绍(27)-- 基于MongoDB的数据库操作整合
基于SqlSugar的开发框架循序渐进介绍(27)-- 基于MongoDB的数据库操作整合
|
7月前
|
人工智能 NoSQL atlas
Fireworks AI和MongoDB:依托您的数据,借助优质模型,助力您开发高速AI应用
我们欣然宣布MongoDB与 Fireworks AI 正携手合作让客户能够利用生成式人工智能 (AI)更快速、更高效、更安全地开展创新活动
2771 1
|
7月前
|
存储 NoSQL MongoDB
MongoDB 助力移动式汽车保养运营模式优化,将开发请求减少 90%
MongoDB针对初级,中级及熟练的技术开发人员推出系列技术文章与行业案例。深入浅出地剖析MongoDB产品基础原理,使用技巧,典型行业场景及应用,还有Code Demo及线上线下活动推荐!
4896 1
MongoDB 助力移动式汽车保养运营模式优化,将开发请求减少 90%
|
7月前
|
存储 NoSQL 算法
国泰航空利用MongoDB和Device Sync开发飞机上的移动应用
作为中国香港本土的航空公司,国泰航空提供的客运和货运服务覆盖全球不同目的地。国泰航空清楚这个流程及其他许多关键业务级流程都需要进行数字化转型。国泰航空积极寻找可提高其运营效率、工作效率和可持续性能力的重大机会,优先开发创新性的数字解决方案。
国泰航空利用MongoDB和Device Sync开发飞机上的移动应用
|
NoSQL Linux MongoDB
开发中MongoDB遇到的各种问题
开发中MongoDB遇到的各种问题
172 0
|
NoSQL 前端开发 JavaScript
MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(8)-Ant Design Blazor前端框架搭建
MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(8)-Ant Design Blazor前端框架搭建
174 0
|
NoSQL 安全 MongoDB
Python 数据库开发实战 -MongoDB的用户管理
Python 数据库开发实战 -MongoDB的用户管理
|
存储 运维 监控
阿里云MongoDB助力纵腾集团提升IT系统效率及开发优化
业务工单系统使用阿里云版MongoDB后,解决了查询效率低的问题,极大地提升了业务效率和用户体验,获得了显著的效果。
阿里云MongoDB助力纵腾集团提升IT系统效率及开发优化

相关产品

  • 云数据库 MongoDB 版