固定大小集合
Overview
固定大小集合是大小固定的集合,支持根据插入顺序插入和检索文档的高吞吐量操作。固定大小集合的工作方式类似于循环缓冲区:一旦一个集合填满了分配的空间,它就会通过覆盖集合中最旧的文档来为新文档腾出空间。
有关创建固定大小集合的更多信息,请参阅 createCollection()
或 create
。
提示
作为固定大小集合的替代方案,可考虑使用 MongoDB 的 TTL(生存时间)索引。如通过设置 TTL 使集合中的数据过期中所述,此类索引允许根据日期类型字段的值以及索引的 TTL 值使普通集合中的数据过期,并将其删除。
TTL索引与固定大小集合不兼容。 您可以在集合上创建索引,但mongod
不会删除过期文档。
行为
插入顺序
固定大小集合可以确保插入顺序被保留。因此,查询不需要索引即可按插入顺序返回文档。如果没有该索引开销,固定大小集合可以支持更高的插入吞吐量。
自动删除最旧的文档
为给新文档腾出空间,固定大小集合会自动删除集合中最早的文档,而无需使用脚本或显式删除操作。
请考虑下列固定大小集合的可能应用场景:
存储大容量系统生成的日志信息。在没有索引的固定大小集合中插入文档的速度接近于将日志信息直接写入文件系统的速度。此外,内置的先进先出属性维护事件的顺序,同时管理存储使用。
在固定大小集合中缓存少量数据。由于缓存的读取量大于写入量,因此需确保该集合始终保留在工作集中(即 RAM 中),或是接受针对所需一个或多个索引的某些写入惩罚。
示例,在副本集中存储操作日志的 副本集 集 oplog使用固定固定大小集合。与其他固定大小集合不同, oplog可以超过其配置的大小限制,以避免删除majority
commit point
。
_id
Index
默认情况下,固定大小集合包含 _id
字段以及针对 _id
字段的索引。
限制和建议
读取
从 MongoDB 5.0 开始,从固定大小集合进行读取时无法使用读关注(read concern) "snapshot"
。
更新
如果您计划更新固定大小集合中的文档,请创建索引,这样更新操作就无需进行集合扫描。
文档大小
如果更新或替换操作更改了文档大小,则操作将失败。
分片
无法对固定大小集合进行分片。
查询效率
使用自然排序,从集合中高效检索最近插入的元素。这类似于在日志文件中使用 tail
命令。
聚合(Aggregation) $out
聚合管道阶段 $out
无法将结果写入固定大小集合。
事务
Stable API
稳定版 API V1 不支持固定大小集合。
步骤
创建固定大小集合
您必须使用db.createCollection()
方法显式创建固定大小集合,该方法是 命令的mongosh
create
助手。创建固定大小固定大小集合时,必须指定MongoDB为集合预先分配的集合大小(以字节为单位)。 固定大小固定大小集合的大小包括少量内部开销空间。
db.createCollection( "log", { capped: true, size: 100000 } )
如果size
字段小于或等于4096 ,则该集合的上限为4096字节。 否则, MongoDB将增加提供的大小,使其成为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
参数指定固定大小集合的大小(以字节为单位)。
此功能会在操作期间保持数据库独占锁。锁定同一数据库的其他操作将被阻止,直到该操作完成。请参阅某些常见客户端操作会采用哪些锁?锁定数据库的操作。
可追加游标
可以将可追加游标与固定大小集合一起使用。与 UNIX tail -f
命令类似,可追加游标“跟踪”固定大小集合的末尾。当新文档插入到固定大小集合中时,可以使用可追加游标继续检索文档。
请参阅可追加游标,了解创建可追加游标的信息。