【MongoDB】固定集合(Capped Collections)

本章内容:

  • 概述
  • 特性
  • 限制和建议
  • 使用步骤

一、概述

固定集合是大小固定的集合,它们支持高吞吐量操作,这些操作根据插入文档和按照插入顺序检索(retrieve)文档。固定集合的工作方式类似于循环缓存:一旦集合的分配空间占满了,它就会通过覆盖集合中最旧的文档为新文档腾出空间。

有关创建固定集合的更多信息,请参见createCollection()create

提示

作为固定集合的替代方案,可以考虑MongoDB  TTL(Time To Live生存时间)索引。如通过设置TTL使集合中数据过期中所述,TTL索引可以基于日期类型字段的值和索引的TTL值使正常集合中的数据过期并删除。

TTL索引与固定集合不兼容。

 

二、特性

 

1. 插入顺序

固定集合确保对数据插入顺序进行维护。因此,无需索引查询即可按插入顺序返回文档。由于没有这种索引开销,则有固定集合可以支持更高的插入吞吐量。

 

2. 自动删除最文档

为了给新文档腾出空间,固定集合会自动删除集合中最早的文档,而无需脚本或显式删除操作。

以下是可能使用固定集合的场景:

  • 存储大容量系统生成的日志信息。在没有索引的情况下将文件插入固定集合中,将插入日志信息速度接近于直接写入文件系统的速度。此外,内置的先进先出属性可在管理存储空间的同时维护插入事件的顺序。
  • 在固定集合中缓存少量数据。由于缓存数据大量读取操作而非写操作,因此要么确保此集合始终保留在工作集中(即在RAM中),要么对所需的一个或多个索引进行写惩罚。

例如,存储操作日志的副本集oplog.rs集合就是使用固定集合。从MongoDB 4.0开始,不同于其他固定集合,操作日志可以超出其配置的大小限制,以避免删除多数提交点

 

3. _id索引

固定集合默认具有_id字段和_id字段上的索引。

 

三、限制和建议

 

1.  更新文档

如果要更新固定集合中的文档,最好先创建索引,这样更新操作就不会执行集合扫描。

 

2. 文档大小

在版本3.2中更改。

如果更新或替换操作更改了文档大小,则该操作将失败。

 

3. 文档删除

无法从固定集合中删除文档。

要删除集合中的所有文档,使用drop()方法删除集合并重新创建固定集合。

 

4. 分片

固定集合无法分片。

 

5. 查询效率

使用自然顺序可以有效地从集合中检索最近插入的元素。这(有点)类似于日志文件上的tail。

 

6. 聚合$ out

聚合管道 $ out结果不能写入固定集合。

 

7. 事务

从MongoDB 4.2开始,在事务中不能写入固定集合。在事务中支持从固定集合中读取。

 

四、操作步骤

 

1. 创建固定集合

只能使用db.createCollection()方法显式创建固定集合,该方法是mongo shell中create命令的帮助器。

创建固定集合时,必须指定集合大小的上限(以字节为单位),MongoDB将为该集合预先分配指定上限大小的空间。固定集合的大小包括少量内部开销空间。

db.createCollection( "log", { capped: true, size: 100000 } )

如果size字段小于或等于4096,则集合的上限为4096字节。否则,MongoDB将提高提供size的大小,使其成为256的整数倍。

此外,还可以使用max字段为集合指定最大文档数,如以下文档所示:

db.createCollection("log", { capped : true, size : 5242880, max : 5000 } )

重要

即使指定最大文档数,也始终需要size参数。如果集合在达到最大文档数之前达到最大size限制,MongoDB将删除较早的文档。

参考资料:db.createCollection()create

 

2.查询固定集合

如果在不指定任何顺序的固定集合上执行find(),则MongoDB保证查询出结果的顺序与插入顺序相同。

要与插入顺序的相反顺序来检索文档,执行find()同时执行sort()方法,并将sort的$natural参数设置为-1,如以下示例所示:

db.cappedCollection.find().sort( { $natural: -1 } )

 

3.检查集合是否是固定集合

使用isCapped()方法来判断集合是否是固定集合,如下所示:

db.collection.isCapped()

 

4.将集合转换为固定集合

convertToCapped命令可将非固定集合转换为固定集合:

db.runCommand({"convertToCapped": "mycoll", size: 100000});

size参数以字节为单位,指定固定集合的大小。

在转换操作期间,它将持有数据库排他锁。被锁定的数据库的其他操作将被阻止,直到该操作完成。

对于锁定数据库的操作,请参阅一些常见的客户端操作采取了哪些锁?

 

5.tailable游标

可以将tailable游标(尾游标)与固定集合一起使用。与Unix tail -f命令类似,tailable游标“尾随”在固定集合的末尾。

将新文档插入固定集合后,可使用可尾游标继续检索文档。

有关创建可尾光标的信息,请参见游标

关于尾游标:MongoDB Tailable Cursors深入剖析

英文原文参考:capped-collections

你可能感兴趣的:(MongoDB,mongodb,数据库,nosql,固定集合,capped)