关于查询时间序列数据
MongoDB 使用匹配的 元字段对文档进行分组,以优化时间序列数据的存储和查询延迟。您选择 metaField
对优化应用程序中的查询的影响最大。
查询 metaField
查询时间序列集合的方式与查询标准 MongoDB 集合的方式相同。有关查询和聚合管道示例,请参阅查询时间序列集合。有关查询最佳实践的列表,请参阅查询最佳实践。
针对时间序列数据的查询通常侧重于集合中的单个时间序列。例如,考虑使用以下模式跟踪股票数据的时间序列集合:
{ _id: 573a1397f29313caabce8347, "ticker": "MDB", "timestamp": ISODate("2024-07-24T13:45:00.000Z"), "price": 248.21, "volume": 6930 }
该集合有以下设置:
timeseries: { timeField: "timestamp", metaField: "ticker", granularity: "seconds" }
MongoDB 对具有匹配的 ticker
值的文档进行分组。服务器不必检查所有文档中所有字段的匹配项,而只需检查 metaField
,在本例中为 ticker
,即可将搜索范围缩小到唯一的时间序列。这符合预期的应用场景,即搜索单个股票上的活动。搜索有关 MongoDB 股票 (MDB) 信息的用户无需考虑 Amazon (AMZN) 的结果。
查询 timeField
查询时间序列数据的第二个主要维度是时间。由于 MongoDB 对具有相同 metaField
值和接近 timeField
值的文档进行分组,这会进一步将查询范围缩小到存储桶范围。最近的事务都保存在内存中,因此可以轻松实时传输数据。
块处理
从版本 8.0 开始,MongoDB 可以使用块处理来执行某些时间序列查询。这一性能改进利用数据“块”而不是单个值来处理查询。当使用时间序列集合时,块处理可提高查询执行速度和吞吐量。
区块处理可显着提高性能并减少长时间运行的聚合管道的开销,这些管道从以下阶段开始:
MongoDB 自动为符合条件的时间序列查询启用区块处理。无法手动指定查询是否使用块处理。
要查看时间序列查询是否使用块处理,请参阅解释计划输出中的 stages
。