文档菜单
文档首页
/
MongoDB 手册
/

时间序列集合限制

本页内容

  • 不支持的功能
  • 聚合 $merge
  • distinct 命令
  • 地理空间查询
  • 文档大小
  • 扩展日期范围
  • 更新
  • 时间序列次要索引
  • 固定集合
  • 集合类型的修改
  • 修改timeFieldmetaField
  • 粒度
  • 桶大小
  • 修改桶参数
  • 分片
  • 分片管理命令
  • 分片键字段
  • 重新分片
  • 事务
  • 视图
  • 快照隔离

时间序列集合通常像常规集合一样工作,但有几个限制。

MongoDB不支持以下时间序列集合的功能

您不能使用 $merge 聚合阶段将数据从另一个集合添加到时间序列集合中。请使用 $out 聚合阶段将文档写入时间序列集合。

您可以使用 $merge 将数据从时间序列集合移动到另一个集合。

由于时间序列集合具有独特的数据结构,MongoDB无法有效地对它们进行唯一值索引。请避免在时间序列集合上使用distinct命令或db.collection.distinct()辅助方法。相反,使用一个$group聚合来按唯一值对文档进行分组。

例如,要查询meta.type的唯一值,其中meta.project = 10,而不是

db.foo.distinct("meta.type", {"meta.project": 10})

使用

db.foo.createIndex({"meta.project":1, "meta.type":1})
db.foo.aggregate([{$match: {"meta.project": 10}},
{$group: {_id: "$meta.type"}}])

这会这样工作

  1. meta.projectmeta.type上创建一个复合索引,并支持聚合。

  2. $match阶段筛选出meta.project = 10的文档。

  3. $group阶段使用meta.type作为分组键,为每个唯一值输出一个文档。

时间序列集合仅支持使用$geoNear聚合阶段对来自针对2dsphere索引的查询的地理空间数据进行排序。您不能在时间序列集合上使用$near$nearSphere运算符。

时间序列集合中文档的最大大小为4 MB。

如果时间序列集合包含在timeField时间戳早于1970-01-01T00:00:00.000Z或晚于2038-01-19T03:14:07.000Z的文档,则不会通过TTL "时间至生存"功能从集合中删除任何文档。

有关TTL删除的详细信息,请参阅通过设置TTL从集合中过期数据。

如果您的时序集合包含在timeField时间戳早于1970-01-01T00:00:00.000Z或晚于2038-01-19T03:14:07.000Z的文档,请在timeField上创建索引以优化查询。

更新命令必须满足以下要求

  • 您只能匹配metaField字段值。

  • 您只能修改metaField字段值。

  • 您的更新文档只能包含更新运算符表达式。

  • 您的更新命令不得限制要更新的文档数量。设置multi: true或使用updateMany()方法。

  • 您的更新命令不得设置upsert: true.

要自动删除旧数据,请设置自动删除(TTL)。

MongoDB 对以下时间序列集合上的索引部分支持

MongoDB 在时间序列集合上不支持以下索引类型

如果时间序列集合上有 二级索引 并且您需要降级功能兼容版本(fCV),则必须首先删除任何与降级 fCV 不兼容的二级索引。有关更多信息,请参阅 setFeatureCompatibilityVersion

您不能将时间序列集合作为 定长集合 创建。

您只能在创建集合时设置集合类型。

  • 您不能将现有集合转换为时序集合。

  • 您不能将时序集合转换为其他类型的集合。

要将数据从现有集合移动到时序集合,请迁移数据到时序集合。

您只能在创建集合时设置集合的 timeFieldmetaField 参数。您无法在此之后修改这些参数。

对于任何粒度参数配置,桶的最大大小为1000个测量值或125KB的数据,取较小者。MongoDB还可能对具有许多唯一值的稀疏数据强制执行更低的最高大小,以确保桶的工作集适合于WiredTiger缓存。

一旦设置了集合的粒度或自定义桶参数bucketMaxSpanSecondsbucketRoundingSeconds,您可以增加桶覆盖的时间范围,但不能减少。使用collMod命令修改参数。例如

db.runCommand({
collMod: "timeseries",
timeseries: { bucketMaxSpanSeconds: 3600, bucketRoundingSeconds: 3600 }
})

注意

bucketMaxSpanSecondsbucketRoundingSeconds必须相等。如果您修改一个参数,您还必须将另一个设置到相同的值。

时间序列集合受到一些分片限制。

您不能在分片时间序列集合上运行分片管理命令。

在分片时间序列集合时,您只能在分片键中指定以下字段

  • metaField

  • metaField 的子字段

  • timeField

您可以在分片键中指定这些字段的组合。分片键模式不允许使用其他字段,包括 _id

指定分片键时

提示

避免仅指定 timeField 作为分片键。由于 timeField 单调递增,可能会导致所有写入都出现在集群的单个块中。理想情况下,数据应均匀分布在各个块中。

有关如何最佳选择分片键的信息,请参阅

从 MongoDB 8.0 开始,将 timeField 作为时间序列集合的分片键已弃用。

您不能对分片的时间序列集合进行重分片。然而,您可以细化其分片键。

您不能在事务中写入时间序列集合。

注意

MongoDB 支持在事务中从时间序列集合进行读取。

  • 时间序列集合是可写入的非物化视图。视图的限制适用于时间序列集合。

  • 您不能从时间序列桶集合命名空间(即以 system.buckets 为前缀的集合)创建视图。

在时间序列集合上执行读取操作时,当读取关注点为"snapshot"时,只有在读取操作中集合不存在并发删除或重命名操作的情况下,才能保证快照隔离。在相同命名空间下使用不同粒度设置重新创建时间序列集合,并不能提供完整的快照隔离。

返回

最佳实践