【时序数据库】时间序列数据和MongoDB第三部分-查询、分析和呈现时间序列数据

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 【时序数据库】时间序列数据和MongoDB第三部分-查询、分析和呈现时间序列数据

在《时间序列数据和MongoDB:第1部分-简介「时序数据库」时间序列数据与MongoDB:第一部分-简介中,我们回顾了理解数据库的查询访问模式需要询问的关键问题。在《时间序列数据和MongoDB:第2部分-模式设计最佳实践「时序数据库」时序数据库和MongoDB第二部分-模式设计最佳实践中,我们探索了时间序列数据的各种模式设计选项,以及它们如何影响MongoDB资源。在这篇博客文章中,我们将讨论如何查询、分析和呈现存储在MongoDB中的时间序列数据。了解客户端如何连接查询您的数据库将有助于指导您设计数据模型和最佳数据库配置。有多种方式可以查询MongoDB。您可以使用本地工具,如MongoDB Shell命令行和MongoDB Compass(基于gui的查询工具)。通过编程方式,MongoDB数据是通过一个广泛的MongoDB驱动程序列表访问的。几乎所有主要编程语言都有驱动程序,包括c#、Java、NodeJS、Go、R、Python、Ruby和许多其他语言

MongoDB还通过使用MongoDB BI连接器提供了第三方BI报告工具集成。流行的基于sql的报表工具,如Tableau、Microsoft PowerBI、QlikView和TIBCO Spotfire,可以直接利用MongoDB中的数据,而不需要将数据ETL到另一个平台进行查询。MongoDB图表,目前处于测试阶段,提供了可视化您的MongoDB数据的最快方法,不需要第三方产品或扁平化您的数据,以便它可以被sql -base BI工具读取。

在这个博客中,我们将介绍使用上述工具查询、分析和呈现时间序列数据。

使用聚合框架查询

MongoDB聚合框架允许开发人员表达执行数据准备、转换和分析的功能管道。这是通过使用一些阶段来完成的,这些阶段执行特定的操作,如分组、匹配、排序或调整数据。流经各个阶段及其相应处理的数据称为聚合管道。从概念上讲,它类似于通过Unix shell命令行管道的数据流。数据从前一阶段获得输入,工作被执行,该阶段的输出作为下一个处理阶段的输入,直到管道结束。图1显示了数据如何流经由匹配和分组阶段组成的管道。


图1:示例数据流经聚合管道

' $match '是这两个阶段管道中的第一个阶段。' $match '将把整个订单集合作为输入,并提供一个包含文档列表的过滤器作为输出,其中字段" status "包含" a "值。第二阶段将这些过滤后的文档作为输入,并对数据进行分组,以生成所需的查询结果作为输出。虽然这是一个简单的示例,但请记住,您可以构建非常复杂的处理管道,利用25个不同阶段类上的100多个运算符,允许您执行诸如转换、编校、排序、分组、匹配、分面搜索、图遍历和不同集合之间的联接等操作。您可以使用其他分布式数据库无法使用的方式处理数据。

对于时间序列数据,我们将使用MongoDB Compass发出一个特别查询,查找给定股票的当天最高价格。Compass是一种GUI工具,它允许您轻松地探索数据。一个有用的特性是能够可视化地构建一个聚合管道,方法是将阶段组装到画布上,然后将结果管道导出为代码,以便复制和粘贴到应用程序中。

为某只股票寻找日高点

在深入研究查询本身之前,回想一下在本博客系列的第2部分中描述的StockGen应用程序,它为我们想要跟踪的5只股票生成了一个月的股价数据。创建的两个集合之一称为“StockDocPerMinute”,它包含一个表示特定股票符号的一分钟数据的文档,如图2所示。

{

"_id" : ObjectId("5b57a8fae303d36d6df69cd3"),

"p" : {

"0" : 58.75,

"1" : 58.75,

"2" : 59.45,

…up to…

"58" : 58.57,

"59" : 59.01

},

"symbol" : "FB",

"d" : ISODate("2018-07-14T00:00:00Z")

}

图2:StockDocPerMinute文档示例

考虑这样一个场景:应用程序为给定的股票行情请求当天最高的价格。如果没有聚合框架,这个查询必须通过检索所有数据返回到应用程序并使用客户端代码计算结果来完成,或者通过在Javascript中定义一个map-reduce函数来完成。从性能或开发人员生产力的角度来看,这两种选择都不是最佳的。

注意,示例文档有一个子文档,其中包含整个分钟间隔的数据。通过使用聚合框架,我们可以轻松地处理此子文档,方法是使用$objectToArray表达式将子文档转换为数组,计算最大值并投影所需的结果。

使用MongoDB指南针,我们可以构建查询使用聚合管道构建器如下:






图7:第五阶段是$sort阶段

我们可以看到,最后一个阶段的输出显示的是每天的最大值。使用聚合管道构建器,我们不需要编写任何代码。为了便于参考,上图中MongoDB Compass构建的完整查询如下图所示:

db.getCollection('StockDocPerMinute').aggregate([

{ $match: { "symbol" : "FB" }

},

{"$project":

{

"year": {"$year": "$d"},

"month": {"$month": "$d"},

"dayOfMonth": {"$dayOfMonth": "$d"},

"p": {"$objectToArray": "$p"},

"Symbol":1

} },

{"$addFields": {"tmax": {"$max": '$p.v'}}},

{"$group": {

_id: {

year: '$year',

month: '$month',

dayOfMonth: '$dayOfMonth'

},

"DayMax": {$max: "$tmax"},

}

},

{$sort: {_id: -1}}

])

利用视图

MongoDB只读视图可以从现有的集合或其他视图创建。这些视图充当只读集合,并在读取操作期间按需计算。由于它们以另一个集合的形式出现,您可以通过限制对视图的底层集合的访问,并只给予客户端对视图的读访问权限,来添加一层安全性。如果你想了解更多关于视图访问控制的知识,请阅读博客文章“提供对MongoDB数据的最低权限访问”。

要查看视图是如何创建的,请考虑用户希望查询股票价格历史记录的场景。我们可以使用createView语法在StockDocPerMinute集合上创建一个视图,如下所示:

db.createView("ViewStock","StockDocPerMinute",

[

{"$project": {"p": {"$objectToArray": "$p"}, "d":1, "symbol":1}},

{"$unwind": "$p"},

{"$project": {"_id": 0, "symbol":1,"Timestamp": {

"$dateFromString": {"dateString":

{"$concat": [{"$dateToString":

{"format": "%Y-%m-%dT%H:%M:",

"date": "$d"}},

{"$concat": ["$p.k", "Z"]}]}}},

"price":"$p.v"}}

])

由于MongoDB只读视图是在运行时具体化的,所以每个查询都可以获得最新的结果。既然已经定义了视图,就可以像访问其他集合一样访问它了。例如,使用我们可以发出的视图查询“FB”股票的第一个价格条目:

db.ViewStock.find({ "symbol":"FB" } ) .sort({d:-1}).limit(1)

您还可以对视图使用聚合框架。下面是某个特定日期的所有“FB”股票行情数据的查询。

db.ViewStock.aggregate({ $match: {

"symbol":"FB",

"Timestamp" : { $gte: ISODate("2018-06-26"), $lt: ISODate("2018-06-27") }}},

{ $sort: { "Timestamp": -1 }

})

使用第三方BI报告工具查询时间序列数据

用户可能希望利用对第三方商业智能报告和分析工具的现有投资。要使这些讲sql的工具能够查询MongoDB中的数据,您可以使用称为MongoDB BI连接器的中间服务。


图8:使用BI连接器使用您喜欢的基于sql的报告工具查询MongoDB数据

BI Connector服务向客户机应用程序提供一个类似于MySQL服务器的端口,并接受发出SQL查询的客户机连接。BI连接器服务然后将这些查询转换为MongoDB查询语言(MQL),并将查询提交给MongoDB数据库。结果从MongoDB返回,并被扁平化为一个表格结构,然后发送回说SQL的客户端。该流的详细信息见图8。

为了演示MongoDB BI连接器的实际应用,让我们使用Tableau Desktop和MongoDB BI连接器来使用时间序列数据。Tableau Desktop有一个MongoDB的连接选项。使用该选项并连接到BI连接器中指定的端口,我们可以看到Tableau枚举了来自MongoDB数据库的表列表,如图9所示。


图9:Tableau中的数据源视图,显示从MongoDB BI连接器返回的信息

这些表实际上是我们在MongoDB中的集合。继续使用Tableau中的工作表视图,我们可以继续使用之前在本文档中创建的视图构建一个显示价格随时间变化的报告。


图10:显示价格随时间变化的示例表格工作表

MongoDB图表

在MongoDB中可视化数据的最快方法是使用MongoDB图表。目前测试版中,它为用户提供了一个网络控制台,用户可以直接从存储在MongoDB中的数据构建和运行报告。有了图表,就不需要运行特殊的服务来查询MongoDB。也不需要将数据移出或将其转换为要查询的不同格式。数据可以直接查询存储在MongoDB的富文档。与其他只读连接一样,您可以将图表连接到次要副本节点,从而将分析和报告查询与服务于操作时间序列应用程序的集群的其余部分隔离开来。要查看MongoDB图表如何表示来自StockGen工具的数据,请查看价格随时间变化曲线图,如图11所示。


图11:显示价格随时间变化的MongoDB图表

在撰写本文的时候,MongoDB图表还处于测试阶段,因此细节和屏幕截图可能与最终版本有所不同。

用MongoDB分析

除了发行高级分析与MongoDB查询聚合框架,MongoDB连接器为Apache火花暴露引发所有的库,包括Scala、Java、Python和r .这使您能够使用火花大数据分析引擎处理时间序列数据的扩展分析功能的MongoDB进一步进行实时分析和机器学习。连接器将MongoDB数据物化为数据数据库和数据集,以便通过机器学习、图表、流和SQL api进行分析。Spark连接器利用MongoDB的聚合管道和丰富的二级索引来提取、过滤和处理所需的数据范围!没有浪费时间提取和加载数据到另一个数据库,以查询您的MongoDB数据使用Spark!


Figure 12: Spark connector for MongoDB


MongoDB R驱动程序为开发人员和统计人员提供了使用惯用的、本地语言访问MongoDB、企业身份验证和对BSON数据类型的全面支持的一流体验。使用R可用的大量库,您可以查询MongoDB时间序列数据并确定局部加权回归,如图13所示。


图13:散点图,显示价格随时间的变化和每秒数据的平滑

MongoDB的R驱动程序可以通过CRAN R归档文件获得。一旦安装,你可以连接到你的MongoDB数据库,并返回可以在R计算中使用的数据。上面的图是用R Studio用以下代码生成的:

library(mongolite)

<p>ts=mongo(collection="StockDocPerSecond", db="Stock", url="mongodb://localhost:27020")</p>

<p>fbquery=ts$find('{ "symbol":"FB"}', fields='{"_id":0, "d":1, "p":1 }')</p>

<p>plot(fbquery$d,fbquery$p, xlab="Date", ylab="Price", main="Price over Time");</p>

<p>lines(lowess(fbquery$d,fbquery$p), col=2);

总结

虽然并非所有的数据在本质上都是时间序列,但越来越多的数据可以被归类为时间序列——这是由允许我们实时而不是批量利用数据流的技术所推动的。每个行业、每个公司都需要对时间序列数据进行查询、分析和报告。真正的业务价值来自于从数据中获得的分析和见解。MongoDB使您能够收集、分析和处理环境中的每个时间序列数据。在这个由三部分组成的系列文章中,我们讨论了一些与特定应用程序需求相关的发人深省的问题。在第二篇博客文章中,我们介绍了几种不同的时间序列模式设计及其对MongoDB性能的影响。最后,我们总结了如何使用MongoDB聚合框架和MongoDB Compass查询时间序列数据,以及使用BI连接器和分析语言(如R)等其他方法。

原型是一回事,但有效地处理TB级数据则是另一回事。使用MongoDB可以很容易地水平扩展时间序列工作负载。通过使用副本集,只读客户端可以连接到副本集辅助服务器来执行查询,而让主服务器专注于写操作。此外,读重工作负载和写重工作负载都可以通过分片进行水平伸缩。虽然对MongoDB架构的深入分析超出了这些博客文章的范围,但你可以在MongoDB架构白皮书中找到很多有用的信息。

物联网(IoT)用例生成过多的时间序列数据。更大的物联网解决方案包括支持用于数据摄入的各种硬件和软件设备,支持实时和历史分析、安全性、高可用性和大规模管理时间序列数据等。MongoDB正在为全球关键的物联网应用提供动力。

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
4天前
|
SQL JavaScript 前端开发
vue中使用分页组件、将从数据库中查询出来的数据分页展示(前后端分离SpringBoot+Vue)
这篇文章详细介绍了如何在Vue.js中使用分页组件展示从数据库查询出来的数据,包括前端Vue页面的表格和分页组件代码,以及后端SpringBoot的控制层和SQL查询语句。
vue中使用分页组件、将从数据库中查询出来的数据分页展示(前后端分离SpringBoot+Vue)
|
2天前
|
存储 NoSQL 算法
使用图数据库进行复杂数据建模:探索数据关系的无限可能
【8月更文挑战第17天】图数据库以其高效的关系查询能力、直观的数据表示方式、灵活的数据模型和强大的可扩展性,在复杂数据建模和查询中展现出了巨大的潜力。随着大数据和人工智能技术的不断发展,图数据库的应用领域也将不断拓展和深化。对于需要处理复杂关系网络和数据关联性的场景来说,图数据库无疑是一个值得深入研究和应用的强大工具。
|
2天前
|
存储 关系型数据库 MySQL
mysql数据库查询时用到的分页方法有哪些
【8月更文挑战第16天】在MySQL中,实现分页的主要方法包括:1)使用`LIMIT`子句,简单直接但随页数增加性能下降;2)通过子查询优化`LIMIT`分页,提高大页码时的查询效率;3)利用存储过程封装分页逻辑,便于复用但需额外维护;4)借助MySQL变量实现,可能提供更好的性能但实现较复杂。这些方法各有优缺点,可根据实际需求选择适用方案。
|
4天前
|
资源调度 关系型数据库 MySQL
【Flink on YARN + CDC 3.0】神操作!看完这篇教程,你也能成为数据流处理高手!从零开始,一步步教会你在Flink on YARN模式下如何配置Debezium CDC 3.0,让你的数据库变更数据瞬间飞起来!
【8月更文挑战第15天】随着Apache Flink的普及,企业广泛采用Flink on YARN部署流处理应用,高效利用集群资源。变更数据捕获(CDC)工具在现代数据栈中至关重要,能实时捕捉数据库变化并转发给下游系统处理。本文以Flink on YARN为例,介绍如何在Debezium CDC 3.0中配置MySQL连接器,实现数据流处理。首先确保YARN上已部署Flink集群,接着安装Debezium MySQL连接器并配置Kafka Connect。最后,创建Flink任务消费变更事件并提交任务到Flink集群。通过这些步骤,可以构建出从数据库变更到实时处理的无缝数据管道。
15 2
|
4天前
|
XML SQL JavaScript
在vue页面引入echarts,图表的数据来自数据库 springboot+mybatis+vue+elementui+echarts实现图表的制作
这篇文章介绍了如何在Vue页面中结合SpringBoot、MyBatis、ElementUI和ECharts,实现从数据库获取数据并展示为图表的过程,包括前端和后端的代码实现以及遇到的问题和解决方法。
在vue页面引入echarts,图表的数据来自数据库 springboot+mybatis+vue+elementui+echarts实现图表的制作
|
4天前
|
JavaScript 前端开发 数据处理
在vue中的form表单中下拉框中的数据来自数据库查询到的数据
这篇文章介绍了如何在Vue框架的表单中将下拉框的数据通过后端接口从数据库动态查询并加载,包括前端HTML代码、JavaScript数据处理、后端接口实现以及表单提交的完整流程。
在vue中的form表单中下拉框中的数据来自数据库查询到的数据
|
5天前
|
SQL 前端开发 数据库
逻辑删除数据库中的数据。
这篇文章介绍了逻辑删除和物理删除的概念与区别,并详细演示了如何在数据库中实现逻辑删除,包括在表中添加一个表示删除状态的字段,并通过修改该字段的值来实现数据的逻辑删除,同时提供了相应的SQL语句、DAO层、Service层和Controller层的代码示例以及前端页面的展示。
逻辑删除数据库中的数据。
|
2月前
|
存储 SQL 多模数据库
多模数据库Lindorm再升级:对接Dataphin,打通数据治理“最后一公里”
Lindorm通过与Dataphin的深度整合,进一步解决了数据集成和数据治理的问题,为企业提供更加高效和更具性价比的方案。
多模数据库Lindorm再升级:对接Dataphin,打通数据治理“最后一公里”
|
1月前
|
安全 数据管理
DataphinV4.1大升级:支持Lindorm开启高性价比数据治理,迎来“公共云半托管”云上自助新模式
DataphinV4.1大升级:支持Lindorm开启高性价比数据治理,迎来“公共云半托管”云上自助新模式
|
2月前
|
数据采集 安全 API
DataphinV4.1大升级: 支持Lindorm开启高性价比数据治理,迎来“公共云半托管”云上自助新模式
Dataphin 是阿里巴巴旗下的一个智能数据建设与治理平台,旨在帮助企业构建高效、可靠、安全的数据资产。在V4.1版本升级中,Dataphin 引入了Lindorm等多项新功能,并开启公共云半托管模式,优化代码搜索,为用户提供更加高效、灵活、安全的数据管理和运营环境,提升用户体验,促进企业数据资产的建设和价值挖掘。
1396 3
DataphinV4.1大升级: 支持Lindorm开启高性价比数据治理,迎来“公共云半托管”云上自助新模式