MongoDB 固定集合


1 什么是固定集合

固定集合(Capped Collections)是固定大小的集合,支持基于插入顺序插入和检索文档的高吞吐量操作。

固定集合的工作方式类似于循环缓冲区:一旦集合填满了其分配的空间,它就会通过覆盖集合中最旧的文档来为新文档腾出空间。

2 操作

1)插入顺序

固定集合保证了插入顺序的保留。因此,查询不需要索引即可按插入顺序返回文档。如果没有此索引开销,固定集合可以支持更高的插入吞吐量。

2)自动删除最旧的文档

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

请考虑以下固定集合的潜在用例:

  • 存储大容量系统生成的日志信息。在没有索引的固定集合中插入文档的速度接近于将日志信息直接写入文件系统的速度。此外,内置的先进先出属性在管理存储使用的同时维护事件的顺序。
  • 在固定集合中缓存少量数据。由于缓存是读取而不是写入繁重的,因此您需要确保此集合始终保留在工作集中(即在RAM中),或者接受所需索引的一些写入惩罚。

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

id指数

默认情况下,固定集合在字段上有一个字段和一个索引。_id_id

3 限制和建议

1)读

从MongoDB 5.0开始,从固定集合读取时,不能使用读取关注”快照”。

2)更新

如果计划更新固定集合中的文档,请创建索引,以便这些更新操作不需要集合扫描。

3)文档大小

在3.2版中更改了。

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

4)文档删除

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

5)分片

您无法对固定集合进行分片。

6)查询效率

使用自然排序可以有效地从集合中检索最近插入的元素。这类似于在日志文件上使用该命令。tail

7)集合体$out

聚合管道阶段$out无法将结果写入固定集合。

8)交易

从MongoDB 4.2开始,您无法写入事务中的固定集合。

4 参数使用

1)创建固定集合

必须使用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 } )

2)查询固定集合

如果在未指定顺序的情况下对固定集合执行find(),MongoDB将保证结果的顺序与插入顺序相同。

要以反向插入顺序检索文档,请将find()sort()方法一起发出,并将 $natural参数设置为 ,如以下示例所示:-1

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

3)检查集合是否已封顶

使用isCapped()方法确定集合是否受到限制,如下所示:

db.collection.isCapped()

4)将集合转换为固定上限

您可以使用convertToCappped命令将非固定集合转换为固定集合:

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

该参数指定固定集合的大小(以字节为单位):size