关于mongodb的Capped Collection

本文详细介绍了MongoDB中的Capped Collection特性及其使用方法,包括如何创建、更新及转换集合,并探讨了Capped Collection在日志管理和数据更新方面的限制与优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        在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.创建固定集合必须指定其大小否则会报错:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值