时间序列
时间序列数据是一系列数据点,可通过分析一段时间内的变化来获得见解。
时间序列数据通常由以下部分组成:
记录数据点的时间。
元数据(有时称为源)是用于唯一标识数据系列且很少更改的标签。元数据存储在 metaField 中。创建时间序列文档后,您无法将元字段添加到其中。有关 metaField 行为和选择的更多信息,请参阅 metaField。
测量(有时称为指标或值)是按时间增量追踪的数据点。一般来说,这些是随时间变化的键值对。
下表给出时间序列数据的示例:
例子 | 测量 | Metadata |
---|---|---|
stockdata | 股票价格 | 证券报价机、交易所 |
天气数据 | 温度 | 传感器标识符、位置 |
网站访客 | 查看计数 | URL |
MongoDB 提供了时间序列集合实现高效率的时间序列数据存储。
时间序列集合
版本 5.0 中的新增功能。
时间序列集合可提供储时间序列数据的效率。在时间序列集合中,写入操作的组织方式保证同源数据与来自相似时间点的其他数据点一起存储。
您可以在用户界面中为 MongoDB Atlas 中托管的部署创建时间序列集合。
收益分析
与普通集合相比,在时间序列集合中存储时间序列数据可提高查询效率,减少时间序列数据和 二级索引的磁盘使用量。MongoDB 6.3 及更高版本会自动为新的时间序列集合创建时间和元数据字段的复合索引。
时间序列集合使用底层列式存储格式并按时间顺序存储数据。此格式具有以下优点:
降低处理时间序列数据的复杂性
提高查询效率
减少磁盘使用量
减少读取操作的 I/O 量
提高 WiredTiger 缓存使用率
行为
时间序列集合的行为通常与其他 MongoDB 集合类似。您可以像平常一样插入和查询数据。
警告
更新和删除命令中的匹配表达式只能指定 metaField。您无法更新时间序列文档中的其他字段。有关更多详细信息,请参阅时间序列删除和更新限制。
MongoDB 将时间序列集合视为由内部集合支持的可写入非物化视图。插入数据时,内部集合会自动将时间序列数据组织成优化的存储格式。
从 MongoDB 6.3 开始:如果创建新的时间序列集合,MongoDB 还会在 metaField 和 timeField 字段上生成复合索引。为了提高查询性能,对时间序列集合的查询使用新的复合索引。复合索引也采用优化的存储格式。
提示
为提高查询性能,您可以在测量字段或时间序列集合中的任何字段上手动添加二级索引。
重要
向后不兼容的功能
必须在降级之前删除时间序列集合:
MongoDB 6.0 或更高版本到 MongoDB 5.0.7 或更早版本。
MongoDB 5.3 到 MongoDB 5.0.5 或更早版本。
警告
不要尝试创建名称为system.profile
的时间序列集合或视图。如果您尝试这样做,MongoDB 6.3 及更高版本会返回IllegalOperation
错误。早期 MongoDB 版本会因此崩溃。
metaFields
时间序列文档可以包含一个可选的元字段,用于分组文档集,优化内部存储和提高查询效率。metaField 应很少更改,并且可以是任何数据类型。metaField 可以是对象,并且可以包含子字段。将字段定义为 metaField 后,您就可以更改 metaField 的值,但不能将 metaField 重新定义为另一个字段。例如,如果创建时间序列文档,并将 metaField 定义为字段 A
,则以后无法将字段 B
转换为 metaField。但是,如果 metaField A
的值是对象,则可以向字段 A
添加新的子字段。
注意
使用数组作为 metaField 可能会导致意外的集合行为,因为数组相等性取决于特定的顺序。
存储桶
MongoDB 使用 metaField 对数据进行分区,以实现高效的组织和检索。创建时间序列集合时,MongoDB 会将文档分组到存储桶中。存储桶中的文档共享相同的 metaField 值,并且具有非常接近的 timeField 值。
时间序列集合中的存储桶数量取决于唯一 metaField 值的数量。与具有很少更改或从不更改的简单 metaField 的集合相比,具有细粒度或动态 metaField 值的集合可能会生成更多、稀疏打包、短期的存储桶。细粒度和动态的 metaField 值通常会降低存储和查询效率。
索引
MongoDB 会自动在时间序列集合的 metaField 和 timeField 上创建复合索引。
metaField 最佳实践
选择很少更改或从不更改的字段作为 metaField 的一部分。
如果可能,请选择过滤表达式中常用的标识符或其他稳定值作为 MetaField 的一部分。
避免选择不用于过滤的字段作为 MetaField 的一部分。取而代之的是,请使用这些字段作为测量值。
开始体验
如要开始使用时间序列集合,请参阅创建和查询时间序列集合。