Docs 菜单
Docs 主页
/
MongoDB Manual
/ /

固定大小集合

在此页面上

  • Overview
  • 行为
  • 插入顺序
  • 自动删除最旧的文档
  • Oplog 集合
  • _id Index
  • 限制和建议
  • 读取
  • 更新
  • 分片
  • 查询效率
  • 聚合(Aggregation) $out
  • 事务
  • Stable API
  • 步骤
  • 创建固定大小集合
  • 查询固定大小集合
  • 检查集合是否为固定大小
  • 将集合转换为固定大小
  • 更改固定大小集合的大小
  • 更改固定大小集合中的最大文档数
  • 可追加游标

固定大小集合是大小固定的集合,支持根据插入顺序插入和检索文档的高吞吐量操作。固定大小集合的工作方式类似于循环缓冲区:一旦一个集合填满了分配的空间,它就会通过覆盖集合中最旧的文档来为新文档腾出空间。

有关创建固定大小集合的更多信息,请参阅 createCollection()create

提示

作为固定大小集合的替代方案,可考虑使用 MongoDB 的 TTL(生存时间)索引。通过设置 TTL 使集合中的数据过期中所述,此类索引允许根据日期类型字段的值以及索引的 TTL 值使普通集合中的数据过期,并将其删除。

TTL 索引与固定大小collection不兼容。

固定大小集合可以确保插入顺序被保留。因此,查询不需要索引即可按插入顺序返回文档。如果没有该索引开销,固定大小集合可以支持更高的插入吞吐量。

为给新文档腾出空间,固定大小集合会自动删除集合中最早的文档,而无需使用脚本或显式删除操作。

请考虑下列固定大小集合的可能应用场景:

  • 存储大容量系统生成的日志信息。在没有索引的固定大小集合中插入文档的速度接近于将日志信息直接写入文件系统的速度。此外,内置的先进先出属性维护事件的顺序,同时管理存储使用。例如, oplog 使用一个固定大小集合。

  • 在固定大小集合中缓存少量数据。由于缓存的读取量大于写入量,因此需确保该集合始终保留在工作集中(即 RAM 中),或是接受针对所需一个或多个索引的某些写入惩罚。

副本集中存储操作日志的 oplog.rs 集合使用固定大小集合。

从 MongoDB 4.0 开始,与其他固定大小集合不同,oplog 可以超过其配置的大小限制,以避免删除majority commit point

注意

MongoDB 会将 oplog 的固定大小四舍五入为最接近的 256 字节的整数倍。

默认情况下,固定大小集合包含 _id 字段以及针对 _id 字段的索引。

从 MongoDB 5.0 开始,从固定大小集合进行读取时无法使用读关注(read concern) "snapshot"

如果您计划更新固定大小集合中的文档,请创建索引,这样更新操作就无需进行集合扫描。

无法对固定大小集合进行分片。

使用自然排序,从集合中高效检索最近插入的元素。这类似于在日志文件中使用 tail 命令。

聚合管道阶段 $out 无法将结果写入固定大小集合。

您无法在 事务 中写入固定 大小 集合。

稳定版 API V1 不支持固定大小集合。

您必须使用db.createCollection() 方法显式创建固定大小集合,该方法是 命令的mongosh create助手。创建固定大小固定大小集合时,必须指定MongoDB将为集合预先分配的集合大小(以字节为单位)。 固定大小固定大小集合的大小包括少量内部开销空间。

db.createCollection( "log", { capped: true, size: 100000 } )

注意

您为 size 字段提供的值必须大于 0 且小于或等于 1024^5(1 PB)。MongoDB 将所有固定大小集合的 size 舍入到最接近的 256 整数倍(以字节为单位)。

此外,您还可以使用 max 字段指定集合的最大文档数,如以下文档所示:

db.createCollection("log", { capped : true, size : 5242880, max :
5000 } )

重要

即使您指定了max个文档, size参数也始终是必需的。如果collection在达到最大文档数之前达到最大大小限制,则 MongoDB 会删除较旧的文档。

提示

请参阅:

如果您对固定大小集合执行 find() 且未指定顺序,则 MongoDB 将保证结果的顺序与插入顺序相同。

要按与插入顺序相反的顺序检索文档,请发出 find() 以及 sort() 方法,将 $natural 参数设置为 -1,如以下示例所示:

db.cappedCollection.find().sort( { $natural: -1 } )

使用isCapped()方法确定集合是否固定大小,如下所示:

db.collection.isCapped()

您可以使用convertToCapped命令将非固定大小集合转换为固定大小集合:

db.runCommand({"convertToCapped": "mycoll", size: 100000});

size 参数指定固定大小集合的大小(以字节为单位)。

此功能会在操作期间保持数据库独占锁。锁定同一数据库的其他操作将被阻止,直到该操作完成。请参阅某些常见客户端操作会采用哪些锁?锁定数据库的操作。

6.0 版本中的新功能

您可以使用 collMod 命令的 cappedSize 选项调整固定大小集合的大小,以字节为单位设置 cappedSizecappedSize必须大于0且小于或等于1024^5 (1 PB )。

注意

在调整固定大小集合的大小之前,必须已经将 featureCompatibilityVersion 设置成最低为"6.0" 的版本。

例如,以下命令将 "log" 固定大小集合的最大大小设置为 100000 字节:

db.runCommand( { collMod: "log", cappedSize: 100000 } )

6.0 版本中的新功能

要更改固定大小集合中的最大文档数,请使用 collMod 命令的 cappedMax 选项。如果 cappedMax 小于或等于 0,则没有最大文档限制。如果 cappedMax 小于集合中的当前文档数,MongoDB 则会在执行下一插入操作时删除多出的文档。

例如,以下命令会将 "log" 固定大小集合中的最大文档数设为 500:

db.runCommand( { collMod: "log", cappedMax: 500 } )

可以将可追加游标与固定大小集合一起使用。与 UNIX tail -f 命令类似,可追加游标“跟踪”固定大小集合的末尾。当新文档插入到固定大小集合中时,可以使用可追加游标继续检索文档。

请参阅可追加游标,了解创建可追加游标的信息。

后退

按需物化视图