MongoDb的固定集合capped collection

MongoDB 固定集合(Capped Collections)是性能出色且有着固定大小的集合,对于大小固定,我们可以想象其就像一个环形队列,当集合空间用完后,再插入的元素就会覆盖最初始的头部的元素!

创建固定集合

Mongo shell:

1
2
3
4
5
6
7
db.createCollection("cappedLogCollection",{capped:true,size:10000})

# max row number
db.createCollection("cappedLogCollection",{capped:true,size:10000,max:1000})

# 普通collection 转化成 capped collection
db.runCommand({"convertToCapped":"posts",size:10000})

创建集合的时候Max属性是可选的,文档数量限制是在容量没满的时候进行淘汰,要是满了,就根据容量限制来替换数据。

特性

1. 插入极快

  • 由于Capped collection是按照文档的插入顺序而不是使用索引确定插入位置,这样的话可以提高增添数据的效率。在没有索引的的集合中插入文档与将日志信息直接写入文件系统的速度接近。

2. 自动淘汰旧记录

  • 如果指定的空间用完,新添加的对象将会取代集合中最旧的对象。MongoDB的操作日志文件oplog.rs就是利用Capped Collection来实现的。

3. 只能插入更新,不允许删除

  • capped collection 不允许执行remove操作,但是可以使用drop整个collection来达到删除的目的。

4. 更新操作不能超过空间大小

  • 进行update某个文档的时候,如果更新的文档大小大于原来指定的空间大小则会失败。

使用场景

结合固定集合的特点,它的使用场景一般有如下几种情况:

  1. 日志存储
    • 利用其自动淘汰及快速插入的特性,相比写入log文件再手动维护日志归档来说,利用固定集合作为日志存储非常实用和方便。
  2. 数据库缓存
    • 缓存一些对象在数据库中,比如计算出来的统计信息。这时需要在 collection 上建立索引,因为使用缓存往往是读比写多。