时间序列集合限制
本页内容
时间序列集合通常像常规集合一样工作,但有几个限制。
不支持的功能
MongoDB不支持以下时间序列集合的功能
聚合$merge
您不能使用 $merge
聚合阶段将数据从另一个集合添加到时间序列集合中。请使用 $out
聚合阶段将文档写入时间序列集合。
您可以使用 $merge
将数据从时间序列集合移动到另一个集合。
distinct命令
由于时间序列集合具有独特的数据结构,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"}}])
这会这样工作
地理空间查询
时间序列集合仅支持使用$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
。
定长集合
您不能将时间序列集合作为 定长集合 创建。
集合类型修改
您只能在创建集合时设置集合类型。
您不能将现有集合转换为时序集合。
您不能将时序集合转换为其他类型的集合。
要将数据从现有集合移动到时序集合,请迁移数据到时序集合。
修改 timeField
和 metaField
您只能在创建集合时设置集合的 timeField
和 metaField
参数。您无法在此之后修改这些参数。
粒度
桶大小
对于任何粒度参数配置,桶的最大大小为1000个测量值或125KB的数据,取较小者。MongoDB还可能对具有许多唯一值的稀疏数据强制执行更低的最高大小,以确保桶的工作集适合于WiredTiger缓存。
修改桶参数
一旦设置了集合的粒度
或自定义桶参数bucketMaxSpanSeconds
和bucketRoundingSeconds
,您可以增加桶覆盖的时间范围,但不能减少。使用collMod
命令修改参数。例如
db.runCommand({ collMod: "timeseries", timeseries: { bucketMaxSpanSeconds: 3600, bucketRoundingSeconds: 3600 } })
注意
bucketMaxSpanSeconds
和bucketRoundingSeconds
必须相等。如果您修改一个参数,您还必须将另一个设置到相同的值。
分片
时间序列集合受到一些分片限制。
分片管理命令
您不能在分片时间序列集合上运行分片管理命令。
分片键字段
在分片时间序列集合时,您只能在分片键中指定以下字段
metaField
metaField
的子字段timeField
您可以在分片键中指定这些字段的组合。分片键模式不允许使用其他字段,包括 _id
。
指定分片键时
提示
避免仅指定 timeField
作为分片键。由于 timeField
单调递增,可能会导致所有写入都出现在集群的单个块中。理想情况下,数据应均匀分布在各个块中。
有关如何最佳选择分片键的信息,请参阅
从 MongoDB 8.0 开始,将 timeField
作为时间序列集合的分片键已弃用。
重分片
您不能对分片的时间序列集合进行重分片。然而,您可以细化其分片键。
事务
您不能在事务中写入时间序列集合。
注意
MongoDB 支持在事务中从时间序列集合进行读取。
视图
时间序列集合是可写入的非物化视图。视图的限制适用于时间序列集合。
您不能从时间序列桶集合命名空间(即以
system.buckets
为前缀的集合)创建视图。
快照隔离
在时间序列集合上执行读取操作时,当读取关注点为"snapshot"
时,只有在读取操作中集合不存在并发删除或重命名操作的情况下,才能保证快照隔离。在相同命名空间下使用不同粒度设置重新创建时间序列集合,并不能提供完整的快照隔离。