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参数设置为-1
的sort()方法一起发出,如以下示例所示:
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。