目录
进入MongoDB中文手册(4.2版本)目录
1 概述
固定集合是固定大小的集合,它们支持高吞吐量操作,这些操作基于插入的顺序进行插入和检索文档的操作。固定集合的工作方式类似于循环缓冲区:一旦集合填充了其分配的空间,它就会通过覆盖集合中最旧的文档为新文档腾出空间。
请参阅createCollection()或create了解有关创建固定集合的更多信息。
提示:
(1)作为固定集合的替代方法,请考虑使用MongoDB的 TTL(Time To Live)索引。通过设置TTL可以使集合中数据过期,这些索引使您可以基于日期类型字段的值和索引的TTL值来使正常集合中的数据过期并被删除。
(2)TTL索引与固定集合不兼容。
2 行为
2.1 插入顺序
固定集合可确保以插入顺序保存。因此,查询不需要索引即可按插入顺序返回文档。没有了这种索引开销,则有固定集合可以支持更高的插入吞吐量。
2.2 自动删除最旧的文档
为了给新文档腾出空间,固定集合会自动删除集合中最旧的文档,而无需脚本或显式删除操作。
考虑以下用于固定集合的潜在用例:
- 存储大容量系统生成的日志信息。在没有索引的情况下将文档插入固定集合中的速度接近将日志信息直接写入文件系统的速度。此外,内置的先进先出属性可在管理存储使用的同时维护事件的顺序。
- 在一个固定集合中缓存少量数据。由于读取缓存而不是写入大量缓存,您可能需要确保此集合始终保留在工作集中(即,在RAM中),或者需要为所需的一个或多个索引付出一定的写代价。
例如,在副本集中存储操作日志的oplog.rs集合使用固定集合。从MongoDB 4.0开始,与其他固定集合不同,oplog可以超出其配置的大小限制,以避免删除多数提交点(majority commit point)。
2.3 _id索引
固定集合默认具有一个_id字段和该字段的索引_id。
3 限制和建议
3.1 更新
如果您打算更新固定集合中的文档,请创建索引,以便于不进行集合扫描即可完成更新操作。
3.2 文档大小
在版本3.2中有更改。
如果更新或替换操作更改了文档大小,则该操作将失败。
3.3 文档删除
您无法从固定集合中删除文档。要从集合中删除所有文档,请使用drop() 方法删除集合并重新创建固定集合。
3.4 分片
您无法将固定集合分片。
3.5 查询效率
使用固有的顺序可以高效的从集合中检索最近插入的元素。这(有点)类似于读取日志文件的末尾。
3.6 聚合$out
聚合管道阶段$out 无法将结果写入固定集合。
3.7 事务
从MongoDB 4.2开始,您不能在事务中写入固定集合。仍支持事务中从固定集合进行读取。
4 程序
4.1 创建固定集合
您必须使用db.createCollection()方法显式创建固定集合 ,该方法是命令mongo shell中用于创建的帮助器 (helper)。创建有固定集合时,必须指定集合的空间最大值(以字节为单位),该值是MongoDB为该集合预先分配的空间大小。固定集合的最大空间包括了用于内部开销的空间。
db.createCollection( "log", { capped: true, size: 100000 } )
如果size字段小于或等于4096,则集合的大小上限为4096字节。否则,MongoDB将提升其大小为256的整数倍。
此外,您可以如下文使用max字段为集合指定文档的最大值。
db.createCollection("log", { capped : true, size : 5242880, max : 5000 } )
重要提示
即使你为文档指定最大值,size参数也是必须的。如果一个集合在达到最大文档数量之前,它的空间大小达到了最大值,那么MongoDB将会移除最老的文档。
4.2 查询固定集合
如果你想在一个固定集合中执行没有指定排序的find()命令,则MongoDB会确保返回结果的顺序与插入顺序相同。
要以插入顺序相反的顺序检索文档,使用find()方法以及带着$natural参数设置为-1的sort()方法, 如以下示例所示:
db.cappedCollection.find().sort( { $natural: -1 } )
4.3 检测是否式固定集合
使用isCapped()方法确定集合是否是固定集合,如下所示:
db.collection.isCapped()
4.4 将集合转换为固定集合
您可以使用以下convertToCapped命令将非上限集合转换为上限集合:
db.runCommand({"convertToCapped": "mycoll", size: 100000});
size参数以字节为单位指定固定集合的大小。
在操作期间,它将持有数据库排他锁。锁定同一数据库的其他操作将被阻止,直到该操作完成。请参阅一些常见的客户端操作采取了哪些锁定用于锁定数据库的操作。
4.5 Tailable游标
您可以将Tailable游标与固定集合一起使用。与Unix的 tail -f 命令类似,Tailable游标跟踪固定集合的末尾。新文档插入固定集合后,您可以使用Tailable游标继续检索文档。
通过Tailable游标查阅创建tailable游标等更多的信息。