固定集合(Capped Collections)是固定大小的集合,支持基于插入顺序插入和检索文档的高吞吐量操作。
固定集合的工作方式类似于循环缓冲区:一旦集合填满了其分配的空间,它就会通过覆盖集合中最旧的文档来为新文档腾出空间。
固定集合保证了插入顺序的保留。因此,查询不需要索引即可按插入顺序返回文档。如果没有此索引开销,固定集合可以支持更高的插入吞吐量。
为了给新文档腾出空间,固定集合会自动删除集合中最旧的文档,而无需脚本或显式删除操作。
请考虑以下固定集合的潜在用例:
例如,在副本集中存储操作日志的oplog.rs集合使用固定集合。从MongoDB 4.0开始,与其他固定集合不同,oplog可以超过其配置的大小限制,以避免删除多数提交点。
id
指数默认情况下,固定集合在字段上有一个字段和一个索引。_id_id
从MongoDB 5.0开始,从固定集合读取时,不能使用读取关注”快照”。
如果计划更新固定集合中的文档,请创建索引,以便这些更新操作不需要集合扫描。
在3.2版中更改了。
如果更新或替换操作更改了文档大小,则该操作将失败。
您无法从固定集合中删除文档。若要从集合中删除所有文档,请使用drop()
方法删除集合并重新创建固定集合。
您无法对固定集合进行分片。
使用自然排序可以有效地从集合中检索最近插入的元素。这类似于在日志文件上使用该命令。tail
$out
聚合管道阶段$out
无法将结果写入固定集合。
从MongoDB 4.2开始,您无法写入事务中的固定集合。
必须使用db.createCollection()
方法显式创建固定集合,该方法是create
命令的mongosh
帮助程序。创建固定集合时,必须指定集合的最大大小(以字节为单位),MongoDB将为集合预先分配该大小。固定集合的大小包括少量的内部开销空间。
db.createCollection( "log", { capped: true, size: 100000 } )
如果该字段小于或等于 4096,则集合的上限为 4096 字节。否则,MongoDB将提高提供的大小,使其成为256的整数倍。size
此外,您还可以使用以下文档中的字段为集合指定最大文档数:max
db.createCollection("log", { capped : true, size : 5242880, max : 5000 } )
如果在未指定顺序的情况下对固定集合执行find(),MongoDB
将保证结果的顺序与插入顺序相同。
要以反向插入顺序检索文档,请将find()
与sort()
方法一起发出,并将 $natural
参数设置为 ,如以下示例所示:-1
db.cappedCollection.find().sort( { $natural: -1 } )
使用isCapped()
方法确定集合是否受到限制,如下所示:
db.collection.isCapped()
您可以使用convertToCappped
命令将非固定集合转换为固定集合:
db.runCommand({"convertToCapped": "mycoll", size: 100000});
该参数指定固定集合的大小(以字节为单位):size