时间序列集合注意事项
时间序列集合通常与普通集合类似,但有额外的例外。有关时间序列集合的行为和结构信息,请参阅时间序列集合.
metaField 考虑事项
AmetaField
应很少更改,可以是任何数据类型。一个 metaField
可以是一个对象,并且可以包含子字段。一旦你将一个字段定义为 metaField
,你可以更改 metaField
的值,但无法将其重新定义为另一个字段。例如,如果你使用 metaField
定义为字段 A
创建时间序列文档,你无法后来将字段 B
转换为 metaField
。然而,如果 A
的值是一个对象,你可以向 A
中添加新的子字段。
注意
将数组用作 metaField
可能会导致意外的集合行为,因为数组相等依赖于特定的顺序。
MongoDB 使用 metaField
来对数据进行分区,以有效地组织和检索。当你创建时间序列集合时,MongoDB 将文档分组到桶中。桶中的文档共享相同的 metaField
值,并且具有彼此接近的 timeField
值。
时间序列集合中的桶的数量取决于唯一的 metaField
值的数量。具有细粒度或动态 metaField
值的集合可能比具有简单 metaField
值(这些值很少或从不更改)的集合生成更多、稀疏填充的短期桶。细粒度和动态 metaField
值通常会降低存储和查询效率。
metaField
最佳实践
将很少或永不更改的字段作为您的 metaField 的一部分。
如果可能,选择作为过滤表达式中的常见标识符或其他稳定值作为您 metaField 的一部分。
在您的metaField中,避免选择未用作过滤的字段。相反,将这些字段用作测量指标。
存储和基数
当您将数据插入到时间序列集合中时,内部集合会自动将数据组织成优化的存储格式,使用桶。如果存在合适的桶,MongoDB会将新数据插入该桶。如果不存在合适的桶,MongoDB会创建一个新桶。为了优化存储,选择很少更改的
具有细粒度或更改
粒度
您可以使用granularity
参数来指定MongoDB根据数据摄入率对时间序列数据进行桶化的频率。下表显示了使用给定granularity
值时,一个数据桶中包含的最大时间间隔
粒度 | 粒度 桶限制 |
---|---|
秒 | 1小时 |
分钟 | 24小时 |
小时 | 30天 |
默认情况下,粒度
设置为秒
。您可以通过将粒度
值设置为与来自同一数据源传入测量值的时间跨度最接近的匹配值来提高性能。例如,如果您正在记录来自数千个传感器的天气数据,但每个传感器每5分钟只记录一次数据,则将粒度
设置为"分钟"
。您添加新文档的频率越低,更粗糙的粒度带来的存储和性能优势就越大。
将粒度
设置为小时
将一个月的数据摄取事件合并到单个桶中,从而导致更长的遍历时间和较慢的查询。将其设置为秒
会导致每个轮询间隔多个桶,其中许多可能只包含单个文档。
在选择粒度
值时,还应考虑典型查询。例如,如果您预期您的查询一次获取1天的数据,则使用"分钟"。更细的粒度,如"秒",会创建覆盖一小时的桶。这需要更多的桶来表示相同的数据,从而对存储和查询性能产生负面影响。更粗糙的粒度,如"小时"(跨度为30天),需要查询一次获取30天的数据,然后过滤掉大多数数据。
有关示例,请参阅为时间序列数据设置粒度。
压缩和硬件
当您向已打开或重新打开的桶中添加数据时,所有时间序列收集都使用压缩桶格式。在缓存中对时间序列数据进行压缩支持高基数工作负载,同时保持高效的查询性能。