Capped Collections

在本页面

Overview

Capped collections是固定大小的集合,它们支持高吞吐量操作,这些操作可以根据插入 Sequences 插入和检索文档。封顶的集合的工作方式类似于循环缓冲区:一旦集合填充了其分配的空间,它就会通过覆盖集合中最旧的文档为新文档腾出空间。

有关创建上限集合的更多信息,请参见createCollection()create

Tip

作为上限集合的替代方法,请考虑使用 MongoDB 的TTL(生存时间)索引。如通过设置 TTL 使集合中的数据过期中所述,这些索引使您可以基于日期类型字段的值和索引的 TTL 值来过期并从常规集合中删除数据。

TTL indexes与上限集合不兼容。

Behavior

Insertion Order

封顶的收藏夹可确保保留广告订单。因此,查询不需要索引即可按插入 Sequences 返回文档。如果没有这种索引开销,则有上限的集合可以支持更高的插入吞吐量。

自动删除最旧的文档

为了给新文档腾出空间,有上限的集合会自动删除集合中最旧的文档,而无需脚本或显式删除操作。

例如,将操作日志存储在replica set中的oplog.rs集合使用有上限的集合。考虑以下用于上限集合的潜在用例:

  • 存储大容量系统生成的日志信息。在没有索引的情况下将文件插入具有上限的集合中,接近于将日志信息直接写入文件系统的速度非常快。此外,内置的先进先出属性可在 Management 存储使用的同时维护事件的 Sequences。

  • 在一个上限的集合中缓存少量数据。由于读取的是高速缓存,而不是繁重的缓存,因此您要么需要确保此集合始终(始终)保留在工作集中(即在 RAM 中),要么需要为所需的一个或多个索引承担一定的写代价。

_id Index

默认情况下,上限集合具有_id字段和_id字段上的索引。

限制和建议

Updates

如果您打算更新上限集合中的文档,请创建索引,以便这些更新操作不需要集合扫描。

Document Size

在版本 3.2 中更改。

如果更新或替换操作更改了文档大小,则该操作将失败。

Document Deletion

您无法从上限集合中删除文档。要从集合中删除所有文档,请使用drop()方法删除集合并重新创建有上限的集合。

Sharding

您无法将有上限的集合分片。

Query Efficiency

使用自然 Sequences 可以有效地从集合中检索最近插入的元素。这(有点)类似于日志文件上的 tail。

Aggregation $out

聚合管道运算符$out无法将结果写入有上限的集合。

Procedures

创建上限集合

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

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

如果size字段小于或等于 4096,则集合的上限为 4096 字节。否则,MongoDB 将提高提供的大小,使其成为 256 的整数倍。

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

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

Important

即使您指定max个文档数,也总是需要size参数。如果集合在达到最大文档数之前达到最大大小限制,MongoDB 将删除较旧的文档。

查询上限集合

如果您在未指定任何排序的上限集合上执行find(),则 MongoDB 保证结果的排序与插入 Sequences 相同。

要以相反的插入 Sequences 检索文档,请将find()连同$natural参数设置为-1sort()方法一起发出,如以下示例所示:

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

检查收藏集是否封顶

使用isCapped()方法来确定集合是否有上限,如下所示:

db.collection.isCapped()

将集合转换为上限

您可以使用convertToCapped命令将无上限的集合转换为有上限的集合:

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

size参数以字节为单位指定上限集合的大小。

在操作期间,它将持有数据库排他锁。锁定同一数据库的其他操作将被阻止,直到该操作完成。有关锁定数据库的操作,请参见一些常见的 Client 端操作会采取什么锁?

Tailable Cursor

您可以将tailable cursor与上限集合一起使用。与 Unix tail -f命令相似,可尾光标“尾部”限定集合的末尾。将新文档插入加盖的集合后,您可以使用可尾光标 continue 检索文档。

有关创建可尾光标的信息,请参见Tailable Cursors