MongoDB 的固定集合(Capped Collections)本质上是一种性能表现非常出色、并且容量预先设定好的特殊集合。所谓“固定大小”,可以将它理解为一个环形队列:当集合空间被写满后,后续写入的新文档会自动覆盖最早插入、位于前面的旧文档。

创建固定集合
我们可以通过 createCollection 来创建 MongoDB 固定集合,并将 capped 选项设置为 true:
>db.createCollection("cappedLogCollection",{capped:true,size:10000})
还可以通过增加 max:1000 属性来限制文档数量:
>db.createCollection("cappedLogCollection",{capped:true,size:10000,max:1000})
判断一个集合是否为固定集合,可以使用以下命令:
>db.cappedLogCollection.isCapped()
如果需要将现有集合转换为固定集合,可以执行下面的命令:
>db.runCommand({"convertToCapped":"posts",size:10000})
上述代码会将已经存在的 posts 集合转换成固定集合。
固定集合查询
固定集合中的文档会按照插入顺序进行存储,因此默认查询结果通常也是按插入顺序返回的。同时,也可以借助 $natural 来调整返回顺序。
>db.cappedLogCollection.find().sort({$natural:-1})
固定集合的功能特点
这类集合支持插入和更新操作,不过更新有一个前提:更新后的文档大小不能超过 collection 本身的容量限制,否则更新会失败。固定集合不支持删除单条文档;如果确实需要清空数据,可以调用 drop() 删除整个集合,但执行 drop() 之后,还需要手动重新创建该集合。
在 32 位系统上,一个 capped collection 的最大值大约为 482.5M;在 64 位系统上,则主要受系统文件大小限制。
固定集合属性及用法
属性
- 属性1:固定集合的插入速度非常快
- 属性2:按照插入顺序进行查询时,输出速度也非常快
- 属性3:在写入最新数据时,能够自动淘汰最早的旧数据
用法
- 用法1:用于存储日志信息
- 用法2:用于缓存少量文档数据
