Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

时间序列集合限制

在此页面上

  • 不支持的功能
  • 聚合 $out 和 $merge
  • distinct 命令
  • 文档大小
  • 更新和删除
  • 时间序列二级索引
  • MongoDB 6.0 及更高版本的time-series二级索引
  • MongoDB 5.0 及更早版本中的时间序列二级索引
  • 固定大小集合
  • 修改集合类型
  • 修改 timeFieldmetaField
  • 修改 granularity
  • 分片
  • 分片管理命令
  • 分片密钥字段
  • 重新分片
  • 事务
  • 查看限制
  • 快照隔离

本页介绍了使用时间序列集合的限制。

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

Atlas Device Sync 支持仅限于使用 Atlas 数据导入的时间序列集合。

您不能使用 $out$merge 聚合管道阶段将来自其他集合的数据添加到时间序列集合中。

由于时间序列集合的独特数据结构, 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"}}])

具体操作如下:

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

  2. $match 阶段过滤 meta.project = 10 的文档。

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

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

从 MongoDB 5.1 开始,您可以执行某些删除和更新操作。

删除命令必须满足以下要求:

  • 您只能匹配 metaField 字段值。

  • 删除命令不得限制要删除的文档数量。 设置justOne: false或使用deleteMany()方法。

如果时间序列集合包含时间戳在 1970-01-01T00:00:00.000Z 之前或 2038-01-19T03:14:07.000Z 之后为 timeField 的文档,则 TTL“生存时间”功能不会从集合中删除任何文档。

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

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

  • 您只能匹配 metaField 字段值。

  • 您只能修改 metaField 字段值。

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

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

  • 更新命令不得设置 upsert: true。

在 MongoDB 5.0 中,时间序列集合仅支持插入操作和读取查询。更新和手动删除操作会导致错误。

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

要删除某个集合中的所有文档,请使用 drop() 方法删除该集合。

MongoDB 6.0 改进了对二级索引的支持。

从 MongoDB 6.0 开始,可以为任何字段添加二级索引

不支持以下索引类型:

不支持TTL索引属性。 对于 TTL 删除,请使用expireAfterSeconds。

以下索引类型只能在metaField上创建:

有关从 MongoDB 6.0 开始提供的time-series二级索引的改进,请参阅 MongoDB 6.0 中的time-series二级索引。

如果在时间序列集合上具有二级索引,并且您需要降级特征兼容性版本 (FCV),必须先删除与降级 FCV 不兼容的任何二级索引。请参阅 setFeatureCompatibilityVersion

在 MongoDB 5.0 及更早版本中:

  • metaField 可以有二级索引。

  • timeField 可以有二级索引。

  • 如果 metaField 是文档,则可以对文档内的字段添加二级索引。

提示

另请参阅:

不能将时间序列集合创建为固定大小集合

只有在创建集合时才能设置集合类型:

  • 现有集合无法转换为时间序列集合。

  • 时间序列集合无法转换为其他集合类型。

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

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

设置granularity后,一次只能增加一个级别。 granularity可以从"seconds"更改为"minutes" ,或从"minutes"更改为"hours" 。 不允许进行其他更改。

要将granularity"seconds"更改为"hours" ,请先将granularity增加到"minutes" ,然后增加到"hours"

从 MongoDB 5.1(和 5.0.6)开始,您可以创建分片时间序列集合。

在 MongoDB 5.0.6 之前的版本中,您无法对时间序列集合进行分片。

您无法在分片的时间序列集合上运行分片管理命令。

对时间序列集合进行分片时,您只能为分片键指定以下字段:

  • 使用 metaField

  • 子字段 metaField

  • 使用 timeField

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

在您指定分片键时:

提示

避免指定 timeField 作为分片键。由于 timeField单调增加的,因此,可能导致所有写入都出现在集群中的单个数据段上。理想情况下,数据均匀分布在数据段之间。

要了解如何最好地选择分片键,请参阅:

您无法对分片的时间序列集合进行重新分片。但是,您可以优化其分片键。

无法在事务中写入时间序列集合。

注意

在事务中支持读取时间序列集合。

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

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

只有在读取操作中未并发对集合进行删除或重命名操作的情况下,对具有读关注 "snapshot" 的时间序列集合进行的读取操作才能保证快照隔离。在同一命名空间上以不同的粒度设置重新创建时间序列集合不会产生完全的快照隔离。

后退

时间序列压缩