在mongodb中有一个非常好用的collection : Capped Collections。
capped collection具有固定的大小,并且在auto-FIFO和age-out方面有很高的性能(具体怎么个高法得有数据支持,这里只讨论怎么做),age-out是基于插入顺序的。
capped collection自动维护插入顺序,在某些特殊的使用场景中非常有效,例如系统运行日志、监控数据(历史数据),在RDBMS中就需要做分区表,定期清理,而mongodb中只要设置好size或者max值则不需要考虑。
创建:
和标准collection不同,capped collection需要你显示地创建,定义collection的大小size,这里size的单位是byte,实际size是256byte的倍数。
> db.createCollection("mycoll", {capped:true, size:4000})
这时已经创建完毕,我们可以使用下面的命令查看mycoll的状态
>db.mycoll.stats(); { “ns” : “mydb.mycoll″, “count” : 0, “size” : 0, “avgObjSize” : NaN, “storageSize” : 4096, “numExtents” : 1, “nindexes” : 0, “lastExtentSize” : 4096, “paddingFactor” : 1, “flags” : 0, “totalIndexSize” : 0, “indexSizes” : { }, “capped” : 1, “max” : 2147483647, “ok” : 1 }
avgObjSize这个状态字,从字面意思可以看出是平均对象大小。
官网提示要注意:
capped collection里的数据是不允许被删除的,所以只有collection的drop()函数被允许。
capped collection没有默认的_id索引,这点可以使用db.mycoll.getIndexes();来查看,显示结果为空[]。
当定义的大小空间使用完毕后,新添加的数据会替代collection中的旧数据(等下测试可以看到)。
当对capped collection使用find()方法的时候,它默认返回的数据是插入顺序,如果要反转顺序,则必须在find()方法后加上sort({$natural:-1})。
>db.mycoll.find().sort({$natural:-1});
下面就来测试数据替换:
>for(i=1;i<=150;i++) {db.mycoll.insert({x:i})}
上面的语句我们循环向mycoll集合中插入了150条数据,以i来标识我们的数据,下面就使用find方法来查看我们已经插入的数据
>db.mycoll.find(); //我就不复制了,命令行复制比较麻烦 这里的数据是从78开始的 然后使用 >db.mycoll.stats(); 可以看到只插入了73个数据,而平均对象大小是36,size是2628,但是我们的storageSize是4096,这个原因官网的一句话可以解释。 Note that the size specified includes database headers
从上面数据从78开始就可以看出确实数据是被替换了
如果我们使用db.mycoll.find().sort({$natural:-1})这条语句,则可以发现第一条记录是150。
选项
size
这是capped collection必须被定义的部分。
max
还可以定义collection中允许存储的最大对象数目,可以用validate()方法查看使用了的空间,从而估算所需的大小。。
db.createCollection("mycoll", {capped:true, size:100000, max:100}); db.mycoll.validate();
查看集合是否是capped collection
db.mycoll.isCapped();
将一个集合转换为capped collection
> db.runCommand({"convertToCapped": "mycoll", size: 100000});
一个小知识:当我们在函数后不加()时,例如db.mycoll.isCapped,这样是用于查看isCapped函数的定义