固定集合是固定大小的集合,支持高吞吐量的基于插入顺序的插入和检索文档操做。固定集合使用一种相似循环缓冲区的方式进行工做。一旦集合填满了其分配的空间,那么新的文档将会覆盖集合中最老的文档。
建立固定集合可经过查看createCollection()
或者create
来查看更多信息。javascript
固定集合保证保存的插入顺序。所以,在顺序插入的时候返回文档不须要索引。java
为新的文档腾出空间,固定集合会自动移除集合中最老的文档,而不用任何脚本或者明确的移除操做。例如, oplog.rs 集合在副本集中使用固定集合存储日志的操做。考虑如下固定集合的使用情形:mongodb
保存大容量系统生成的日志信息,在一个没有索引的固定集合中插入文档与直接在文件系统中写入日志信息所花费的时间很是接近。此外,内置的先入先出策略保证了事件的顺序,同时管理内存的使用。segmentfault
在固定集合中缓存了少许的数据。因为是缓存是读取而不是大批量的写,you would either need to ensure that this collection always remains in the working set (即在RAM中) or accept some write penalty for the required index or indexes.缓存
固定集合默认状况下有一个_id
字段和_id
字段索引。app
若是你计划在固定集合中更新文档,建立一个索引,这样更新操做不须要请求集合扫描。ui
在3.2版本中改变
若是一个更新或者替换操做将会改变文档的大小,那么操做将会失败。this
你不能从一个固定集合中删除文档。从一个集合中移除全部的文档,使用drop()
方法来删除集合和重建固定集合。日志
你不能分片一个固定集合。code
使用天然顺序从集合中高效的检索最近插入的元素。这(有点)相似于在一个日志文件上跟踪。
聚合管道操做$out
不能将结果写入到固定集合中。
你必须使用db.createCollection()
方法显式的建立一个固定集合。这是 Mongo Shell 一个建立命令,当建立一个固定集合的时候,你必须指定集合的最大值(以字节为单位),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
参数也是必须的。若是一个集合在达到最大文档数量以前,它的大小达到了最大值,那么MongoDB将会移除最老的文档.
若是你想在一个固定集合中执行没有指定排序的find
命令。那么MongoDB保证查询出来的结果顺序跟插入顺序是相同的。
使用反向插入顺序检索文档,使用find()
方法带着$natural
参数设置为-1
的sort()
方法, 如如下示例所示:
db.cappedCollection.find().sort( { $natural: -1 } )
使用isCapped()
方法来判断一个集合是不是固定集合:
db.collection.isCapped()
你可使用convertToCapped
命令来将一个非固定集合转化为固定集合:
db.runCommand({"convertToCapped": "mycoll", size: 100000});
在固定集合中size
参数指定的大小单位为字节。
警告:这个命令将得到全局写锁,而且将会阻止其余操做,直至命令完成。
当数据过时以后,为了进一步加强灵活性,考虑到MongoDB的TTL索引。综上所述,集合经过设置TTL来过时数据。这些索引容许你从正常的集合中使用特定的类型,基于日期类型的字段值和TTL值索引来过时和移除数据。
TTL集合不兼容固定集合。
你能够在固定集合中使用Tailable 游标
,相似于Linux的tail -f
命令,Tailable 游标 会追踪
固定集合的末尾。做为新的文档插入到固定集合,你可使用Tailable 游标
来继续检索文档。
在建立Tailable 游标
的时候能够查看Tailable 游标
来获取更多信息。
下一章:https://segmentfault.com/a/11...
本文连接:https://docs.mongodb.com/manu...