日期:2014-05-16  浏览次数:20506 次

MongoDB学习(三)Capped Collections

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

?

?

?

?

?

?

?

?

?

?

?