时间序列集合限制
在此页面上
本页介绍了使用时间序列集合的限制。
不支持的功能
时间序列集合不支持以下功能:
Atlas Device Sync 支持仅限于使用 Atlas 数据导入的时间序列集合。
聚合 $merge 和 $out
您不能使用 $merge
聚合阶段将另一个集合中的数据添加到时间序列集合中。
在版本 7.0.3 中进行了更改:您可以使用 $out
聚合阶段将文档写入时间序列集合。
distinct 命令
由于时间序列集合的独特数据结构, MongoDB 无法有效地为不同值建立索引。避免在时间序列集合中使用 distinct
命令或 db.collection.distinct()
辅助方法。取而代之的是,使用 $group
聚合按不同的值对文档进行分组。
例如,要在 meta.project = 10
的文档上查询不同的 meta.type
值,而不是:
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"}}])
具体操作如下:
文档大小
时间序列集合中文档的最大大小为 4 MB。
删除
从 MongoDB 5.1 开始,您可以对时间序列集合执行有限的删除操作。MongoDB 7.0 取消了基于 delete
命令的大部分操作限制。
多文档不支持删除时间序列。
从 MongoDB 5.1 到 6.3,删除命令必须满足以下要求:
您只能匹配 metaField 字段值。
您的删除命令不得限制要删除的文档数量。设置
justOne: false
或使用deleteMany()
方法。
从 MongoDB 7.0 开始,对这些 delete
命令只有一项与时间序列相关的限制:
您不能将这些命令用于多文档事务。没有其他限制。
如果时间序列集合包含时间戳在 1970-01-01T00:00:00.000Z
之前或 2038-01-19T03:14:07.000Z
之后为 timeField
的文档,则 TTL“生存时间”功能不会从集合中删除任何文档。
有关 TTL 删除的详细信息,请参阅通过设置 TTL 使集合中的数据过期。
更新
从 MongoDB 5.1 开始,您可以执行有限的更新操作。
更新命令必须满足以下要求:
您只能匹配
metaField
字段值。您只能修改
metaField
字段值。您的更新文档只能包含更新操作符表达式。
您的更新命令不得限制要更新的文档数量。设置
multi: true
或使用updateMany()
方法。更新命令不得设置 upsert: true。
在 MongoDB 5.0 中,时间序列集合仅支持插入操作和读取查询。更新和手动删除操作会导致错误。
要自动删除旧数据,请设置自动删除 (TTL)。
要删除某个集合中的所有文档,请使用 drop()
方法删除该集合。
时间序列二级索引
MongoDB 6.0 及更高版本改进了对时间序列集合二级索引的支持。有关这些选项的摘要,请参阅 MongoDB 6.0 及更高版本的时间序列二级索引。
时间序列二级索引
从 MongoDB 6.3 开始,时间序列集合支持 metaField
上部分索引的 expireAfterSeconds
索引属性。对于 MongoDB 的早期版本,请使用集合级别 expireAfterSeconds 参数。
从 MongoDB 6.0 开始,可以为任何字段添加二级索引。
MongoDB 部分支持以下索引类型:
MongoDB 不支持以下索引类型:
如果时间序列集合上有从节点(secondary node from replica set)索引,并且需要降级特征兼容性版本(FCV ),则必须首先删除与降级FCV不兼容的所有从节点(secondary node from replicasetFeatureCompatibilityVersion
set)索引。有关更多信息,请参阅 。
MongoDB 5.0 及更早版本中的时间序列二级索引
在 MongoDB 5.0 及更早版本中:
metaField
可以有二级索引。timeField
可以有二级索引。如果
metaField
是文档,则可以对文档内的字段添加二级索引。
固定大小集合
不能将时间序列集合创建为固定大小集合。
修改集合类型
只有在创建集合时才能设置集合类型:
现有集合无法转换为时间序列集合。
时间序列集合无法转换为其他集合类型。
要将数据从现有集合移动到时间序列集合,请将数据迁移到时间序列集合。
修改 timeField
和 metaField
您只能在创建集合时设置集合的 timeField
和 metaField
参数。您无法在后续修改这些参数。
粒度
存储桶大小
对于粒度参数的任何配置,存储桶的最大大小为 1000 个测量值或 125KB 数据,以较小者为准。MongoDB 还可以对具有许多唯一值的高关联基数数据强制实施较低的最大大小,以便存储桶的工作集适合 WiredTiger 缓存。
修改分桶参数
设置集合的 granularity
或自定义分桶参数 bucketMaxSpanSeconds
和 bucketRoundingSeconds
后,您可以增加存储桶涵盖的时间跨度,但不能减少时间跨度。使用 collMod
命令来修改这些参数。例如:
db.runCommand({ collMod: "timeseries", timeseries: { bucketMaxSpanSeconds: 3600, bucketRoundingSeconds: 3600 } })
注意
bucketMaxSpanSeconds
和 bucketRoundingSeconds
必须相等。如果修改一个参数,则还须将另一个参数设为同一值。
分片
从 MongoDB 5.1(和 5.0.6)开始,您可以创建分片时间序列集合。
在 MongoDB 5.0.6 之前的版本中,您无法对时间序列集合进行分片。
分片管理命令
您无法在分片的时间序列集合上运行分片管理命令。
分片密钥字段
对时间序列集合进行分片时,您只能为分片键指定以下字段:
使用
metaField
子字段
metaField
使用
timeField
您可以在分片键中指定这些字段的组合。不允许在分片键模式中使用任何其他字段,包括 _id
。
在您指定分片键时:
提示
避免仅指定 timeField
作为分片键。由于 timeField
是单调增加的,因此,可能导致所有写入都出现在集群中的单个数据段上。理想情况下,数据均匀分布在数据段之间。
要了解如何最好地选择分片键,请参阅:
重新分片
您无法对分片的时间序列集合进行重新分片。但是,您可以优化其分片键。
事务
无法在事务中写入时间序列集合。
注意
在事务中支持读取时间序列集合。
视图
时间序列集合是可写的非物化视图。视图限制将应用于时间序列集合。
您无法从时间序列存储桶集合命名空间(即前缀为
system.buckets
的集合)创建视图。
快照隔离
只有在读取操作中未并发对集合进行删除或重命名操作的情况下,对具有读关注 "snapshot"
的时间序列集合进行的读取操作才能保证快照隔离。在同一命名空间上以不同的粒度设置重新创建时间序列集合不会产生完全的快照隔离。