在mongodb中日志的累积是个可怕的问题,日志会记录mongodb中的每项操作,项目中我们在做测试,连续发查询一周就积累了快4G的日志。查阅一些博客发现一些人是固定住日志的大小,当文件大小达到一些数目时就自动创建另一个文件保存日志。
后来找到了Capped Collection,下面是Capped Collection的一些使用方法。
Capped Collection :
Capped Collection 是一种特殊的集合,它大小固定,当集合的大小达到指定大小时,新数据覆盖老数据。Capped collections可以按照文档的插入顺序保存到集合中,而且这些文档在磁盘上存放位置也是按照插入顺序来保存的,所以当我们更新Capped collections中文档的时候,更新后的文档不可以超过之前文档的大小,这样话就可以确保所有文档在磁盘上的位置一直保持不变。
由于Capped collection是按照文档的插入顺序而不是使用索引确定插入位置,这样的话可以提高增添数据的效率。MongoDB的操作日志文件oplog.rs就是利用Capped Collection来实现的。使用:
db.createCollection("mycoll",{capped:true,size:1024,max:10}) :创建Capped Collection;
db.mycoll.isCapped():查看是否是capped的,如是,则返回true;
db.mycoll.stats():查看是否是capped的;可返回该集合状态;、
db.mycoll.remove({id:9988}):报错:can't remove from a capped collection;
原因:使用Capped Collection 不能删除一个文档。
db.mycoll.drop():返回true,删除整个集合;db.runCommand({convertToCapped:'mycoll',size:10000,max:3}):输出{ "ok" : 1 } ,将普通集合转换为固定集合;
尝试去更新一个文档
> db.mycoll.find({id:9998}) { "_id" : ObjectId("5274b477f007ff8bb84f5f67"), "id" : 9998, "name" : "aa" }
> db.mycoll.update({id:9998},{$set:{name:"China"}})
> db.mycoll.find({id:9998}) { "_id" : ObjectId("5274b477f007ff8bb84f5f67"), "id" : 9998, "name" : "China" }
> db.mycoll.update({id:9998},{$set:{name:"HeBeiOfChina"}}) failing update: objects in a capped ns cannot grow
注意:
这里成功的把name属性从aa更新为China,但当我们从China更新到HeBeiOfChina时失败了。失败的原因更新后的文档大小值不能超过原有空间,否则更新失败。但是为什么我们更新为China没有报错呢?这里面就涉及到MongDB的Record Padding和内存对齐问题,为了提高数据的插入效率,减少数据的移动带来的性能下降,每条记录都会有不定长度的预留空间。
注意: a.创建固定集合不像普通集合,固定集合需要显示的创建使用
b.创建固定集合必须指定其大小否则会报错: