插入、更新、定位、删除和聚合都是可以在时间序列集合上执行的操作,就像它们在标准集合上一样。在幕后,存在着根本的区别。当你向MongoDB插入数据时,它被转换为一种最佳的存储格式。一个时间序列比一个普通的集合更简单,查询效率更高。
时间序列集合在MongoDB中被视为非物质化的可写视图。数据被更有效地保存,节约了磁盘空间,并且自动建立了基于时间的内部索引。默认使用zstd算法代替snappy来压缩数据。新的压缩算法有更高的比率,需要更少的CPU功率,并且特别适合于文件之间有微小差异的时间序列分析。
将来有可能改变压缩算法,尽管不鼓励这样做。当你插入一个文档时,时间序列集合不会像其他集合一样自动建立。它必须被明确创建。
什么是Ubuntu 20.04中MongoDB的时间序列?
时间序列数据库是一个定制的数据库,它是为存储由不断的数值流加上时间戳有效创建的数据而建立的。最常见的应用是存储来自传感设备的数据,这些设备以固定的时间间隔提供数据点,但现在它们被用于服务更广泛的应用。
以下是一些可能的应用实例。
- 来自物联网的数据
- 网络服务、应用程序和基础设施都处于持续的监控之下。
- 估算销售
- 了解金融趋势
- 来自自动驾驶汽车或其他物理物体的数据正在被处理。
一个时间序列的专门数据库使用压缩技术来减少所需的空间,同时提供访问渠道来深入挖掘数据。这增强了使用时间范围过滤器时的数据检索和聚合性能。它们比利用传统的关系型数据库更具成本效益。
时间序列中的值一旦被记录下来,通常不应改变;因此,它们被指定为仅适用于INSERT或不可变的数据点。一旦数据被保存下来,更新动作就极为罕见。
Ubuntu 20.04中MongoDB时间序列数据存储的准则
我们对MongoDB中的时间序列数据有一些准则,概述如下。
- 在调整你的数据时,考虑数据特征和查询模式,以获得适当的元字段和时间字段。
- 在可能的情况下,结合时间序列数据和时间序列集合。
- 在利用时间序列集合时,单个测量值或测量集应保存为一个文件,并分批添加。
- 根据我们的数据接收步伐,定制我们关于元字段的属性值的数据粒度,或我们独特的元字段的不同配对。
如何在Ubuntu 20.04中使用时间序列MongoDB
在处理时间序列数据时,你通常需要的不仅仅是存储;你还需要快速的读写功能以及高级查询功能。从MongoDB 5.0开始,MongoDB现在可以本地处理时间序列数据。在MongoDB中给出一个时间序列集合时,应该指定以下选项。
可以使用createCollection()命令来启动一个新的时间序列集合。
timeField。在创建一个时间序列集合时必须使用timeField选项。timeField表示每个文档中包含日期的属性描述。我们还应该考虑以下替代方案。
metaField。metaField指定每个文档中包含元数据的列的名称。metaField作为一个标签或标记,使时间序列集合能够识别一个时间序列的来源。这个字段不应该,也只应该随着时间的推移而改变。
颗粒度。如果提供了一个匹配的元字段,粒度属性指定了文件之间的时间间隔。标准的粒度是 "秒",表示元字段所定义的每个时间序列的高频摄入率。粒度可以调整为 "秒"、"分钟 "或 "小时",它可以在任何时候改变,使其变得更糟糕。然而,因为你不能把粒度从 "分 "改成 "秒",所以最好从更细的粒度开始,然后逐步提高到更苛刻的粒度。
expireAfterSeconds。最后,如果你打算在指定时间后删除数据,我们可以加入expireAfterSeconds字段,指定多少秒后文件才会过期并被自动销毁。
在MongoDB中用时间序列插入文档
至少,每个添加到时间序列集合的文档必须定义timeField。在下面的插图文档中,日期就是timeField。值得注意的是,只要是BSON类型或Date,timeField可以被称为任何你想要的东西。将文档插入其他MongoDB集合的任何技术都可用于将文档添加到时间序列集合中。为此,我们创建了一个 "webVisitors "的集合,如下所示。
在我们插入的每个文档中都应该包括一个测量值。使用下面的命令可以一次插入许多文档。
在Ubuntu 20.04中检索MongoDB中的时间序列数据
时间序列文档可以像MongoDB的其他集合的文档一样被查询。例如,通过MongoDB Shell,我们使用findOne来寻找webVisitors集合()中的文档,如下所示。
前面的查询显示了以下结果,你可以看到。
在Ubuntu 20.04中对MongoDB的时间序列数据进行聚合
在这里,我们使用了一个聚合管道,如增加更多的查询功能。下面的例子中,聚合管道通过测量数据组合所有的文档,然后提供一个网站当天所有访客测量的平均值。
当我们在集合websiteVisitors上执行聚合管道时,输出产生了来自集合 "websiteVisitors "的访问者文档的平均值,如下所示。
结论
有大量的时间序列数据,但维护和访问这些数据可能很困难。MongoDB获得了对时间序列的原生支持,使处理时间序列数据的工作变得相当容易、快速和便宜。我们已经给出了一个简单的介绍,其中包括在MongoDB中使用时间序列的一些指南。我们有一些时间序列的插图,展示了我们如何在MongoDB集合中以一些可能的方式使用时间序列。