OPTIONS
翻译或纠错本页面

限制集

限制集 是固定大小的集合支持基于文档插入顺序的高吞吐率的插入、检索、删除操作。限制收集工作在某种程度上类似于循环缓冲区:一旦一个文档填满分配给它的空间,他将通过在限制集中重写老文档来给新文档让出空间

参考方法 createCollection() 或者命令 create 获得创建限制集时的更多信息

限制集有以下行为

  • 限制集保证了插入顺序,因此查询不需要索引来按插入的顺序返回文档。没有索引开销,限制集能够支持高插入吞吐率

  • 限制集保证插入顺序同在硬盘上的顺序(自然顺序) 完全相同,通过禁止增加文档的大小来做到。限制集值允许复合原始尺寸的更新,这确保了一个文档不改变它在硬盘上的位置。

  • 限制集自动删除在集合中的老文档,不需要脚本或者显示移除操作

例如,oplog.rs 集合用一个限制集存储一个在复制集上的操作日志。考虑下边限制集的潜在应用案例:

  • 存储高容量系统生成的日志信息。没有索引的情况下向限制集中插入文档的速度接近于直接在文件系统中写日志的速度。此外,内建的*fisrt-in-first-out*特性在管理存储使用时维护了事件的顺序。

  • 在限制集中缓存少量的数据。既然缓存是读远大于写,因此或者确保集合经常驻留在工作集(i.e. in RAM),或者接受一些需要索引的写惩罚

建议和限制

  • 你可以做文档的原地更新。如果此更新操作引起了文档的增长超出了他们原始尺寸,那么更新操作将失败。

    加入你计划在限制集中更新文档,那么创建一个索引,这样更新操作就不需要表级别的扫描了

  • 假如你更新一个限制集中的文档到比它原始尺寸小的大小,那么从机将从主机上同步,从机将基于当前较小的文档复制并分配空间。如果主机接着收到更新操作增加文档到它原来尺寸,那么主机将接受更新,但是从机将失败伴随着``failing update: objects in a capped ns cannot grow`` 的错误消息。

    为避免此错误,从其他复制集成员最近一个快照创建你的从机。跟着文档 our tutorial on filesystem snapshots 完善你的从机。

    用文件系统快照初始你的从机是保证主机和从机二进制文件完整性的唯一方法。MMS备份快照在此种情况下不充分,当你需要从机不仅仅内容与主机保持一致时。

  • 你不能从限制集中删除文档。用’emptycapped’命令从限制集中删除所有文档。用:method:~db.collection.drop() 方法删除整个集合。

  • 你不能对限制集分片

  • 在2.2之后限制集默认情况下会创建一个``_id``字段和在``_id``字段上的索引。在2.2之前限制集默认情况下没有``_id``字段上的索引。如果你在2.2之前的复制集上用限制集那么你应该明确的在``_id``字段上创建索引。

    警告

    在2.2之前,如果你有一个在``local``数据库之外的:term:replica set`上有一个限制集,你应该在字段``_id``上用:method:`~db.collection.ensureIndex()`方法的``unique: true``选项来创建唯一索引或者通过在 ``_id` 字段上用 ObjectId 选项

  • 用自然顺序检索限制集中大部分最近插入的文档。这类似于跟踪日志文件。

  • 聚合管道操作:pipeline:`$out`不能写结果到限制集中

程序

创建一个限制集

你必须用方法 createCollection() 明确创建限制集,在程序 mongo shell命令 create 中有帮助信息。 当创建一个限制集时,你必须用bytes指定这个限制集的最大尺寸,MongoDB将为这个限制集预分配一些空间。限制集的大小包括少量内部开销。

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

另外,你可以为限制集指定最大文档数据,用 max 字段就像下边的文档:

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

重要

The size argument is always required, even when you specify max number of documents. MongoDB will remove older documents if a collection reaches the maximum size limit before it reaches the maximum document count.

查询一个限制集

如果你在限制集上执行一个没有指定排序的 find() 方法,MongoDB保证结果的顺序是和插入顺序相同。

用同插入相反的顺序检索文档, find() 连同 sort() 方法,及 $natural 参数设置为 -1 就像下面的例子:

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

检查一个集合是否是限制集

isCapped() 方法来判定一个集合是否是限制集,如下:

db.collection.isCapped()

转换为限制集

你可以用命令 convertToCapped 转换一个非限制集成为一个限制集:

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

``size``参数用bytes指定限制集及的大小。

警告

这个命令将获得一个全局写锁并将阻塞其他操作,直到它完成为止。

在 2.2 版更改: 在2.2之前,限制集没有在字段 _id 上的索引,直到你指定 autoIndexIdcreate 命令上,2.2之后变为默认的了。

在规定的时间周期之后将自动移除数据

当数据到期时对于另外的灵活性,考虑MongodDB的 TTL 索引,就像在 Expire Data from Collections by Setting TTL 中描述的。

TTL Collections 与限制集不兼容。

Tailable游标

你可以用 tailable cursor 与限制集。同unix中的 tail -f 命令相似, tailable光标 “tails” 一个限制集的结尾。随着新文档被插入到限制集,你能用 tailable光标来继续检索文档。

参考文档 创建Tailable游标 创建tailable游标。