上限集合是固定大小的集合,它们支持高吞吐量操作,这些操作根据插入顺序插入和检索文档。封顶集合的工作方式类似于循环缓冲区:一旦集合填充了其分配的空间,它就会通过覆盖集合中最旧的文档为新文档腾出空间。
请参阅createCollection()
或create
了解有关创建封顶集合的更多信息。
小费
作为上限集合的替代方法,请考虑使用MongoDB的 TTL(生存时间)索引。如通过设置TTL从集合中使数据过期中所述,这些索引使您可以基于日期类型字段的值和索引的TTL值使正常集合中的数据过期并删除。
TTL索引与上限集合不兼容。
封顶的收藏夹可确保保留广告订单。因此,查询不需要索引即可按插入顺序返回文档。如果没有这种索引开销,则有上限的集合可以支持更高的插入吞吐量。
为了给新文档腾出空间,有上限的集合会自动删除集合中最旧的文档,而无需脚本或显式删除操作。
考虑以下用于上限集合的潜在用例:
例如,将操作日志存储在副本集中的oplog.rs集合使用上限集合。从MongoDB 4.0开始,与其他有上限的集合不同,oplog可以超出其配置的大小限制,以避免删除。majority
commit point
_id
索引¶上限集合
默认具有一个_id
字段和该字段的索引_id
。
如果您打算更新上限集合中的文档,请创建索引,以便这些更新操作不需要集合扫描。
您无法将有上限的集合分片。
使用自然顺序可以有效地从集合中检索最近插入的元素。这(有点)类似于日志文件上的tail。
从MongoDB 4.2开始,您不能在transaction中写入上限集合。事务中仍支持从上限集合中读取数据。
您必须使用db.createCollection()
方法显式创建带上限的集合
,该方法是命令mongo
外壳程序中的帮助器
create
。创建有上限的集合时,您必须指定集合的最大大小(以字节为单位),MongoDB将为该集合预先分配最大大小。上限集合的大小包括少量内部开销空间。
如果该size
字段小于或等于4096,则集合的上限为4096字节。否则,MongoDB将提高提供的大小,使其成为256的整数倍。
此外,您还可以使用max
以下文档中的字段为集合指定最大文档数:
重要
即使指定文档数,也始终需要该size
参数。如果集合在达到最大文档数之前达到最大大小限制,MongoDB将删除较旧的文档。max
如果您find()
在没有指定任何排序的上限集合上执行,则MongoDB保证结果的排序与插入顺序相同。
要以相反的插入顺序检索文档,请
与参数设置为find()
的sort()
方法一起$natural
发出-1
,如以下示例所示:
使用该isCapped()
方法确定集合是否有上限,如下所示:
您可以使用以下convertToCapped
命令将非上限集合转换为上限集合:
该size
参数以字节为单位指定上限集合的大小。
在操作期间,它将持有数据库排他锁。锁定同一数据库的其他操作将被阻止,直到该操作完成。请参阅一些常见的客户端操作采取了哪些锁?用于锁定数据库的操作。
您可以将可结尾的游标与上限集合一起使用。与Unix 命令类似,可尾光标“尾部”限定集合的末尾。将新文档插入加盖的集合后,您可以使用可尾光标继续检索文档。tail -f
见Tailable光标有关创建tailable光标信息。