在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函数的定义