首页 > 数据库 >MongoDB中的Capped Collection

MongoDB中的Capped Collection

时间:2023-04-03 09:55:27浏览次数:40  
标签:Collection MongoDB clusterTime db collection 索引 文档 Capped capped

capped collection是固定大小的结合,支持基于插入顺序的插入和检索文档的高吞吐量操作。Capped collections的工作方式类似循环buffer:一旦一个集合填满了它分配的空间,它就会通过覆盖集合中最老的文档来为新文档腾出空间。

作为capped collection的替代方案,可以考虑MongoDB的TTL(Time to Live)索引。正如在通过设置TTL使集合中的数据过期中所述,这些索引允许根据日期类型字段的值和索引的TTL值过期并从普通集合中删除数据。不过TTL索引与capped collection不兼容。

capped collection会维护文档的插入顺序,因此,不需要额外的索引来检索文档。这就使得capped collection可以维护一个高吞吐量的插入。capped collection的文档包含_id列,这是默认的索引。文档的删除操作也是基于最老的_id。mongodb会自动将capped collection扩展成256的整数倍。用户应该避免更新capped collection中的文档,如果你想更新,也是可以更新的。除非更新后不会增加文档的大小,而且也是兼做轻量级的更新,因为要扫描整个capped collection。可以创建一个索引,避免集合扫描。

创建capped collection

> db.createCollection( "logs", { capped: true, size: 500000 } );  // size is in bytes.

也可以指定capped collection中存放的文档的最大值。

> db.createCollection( "logs", { capped: true, size: 500000, max: 500 } );  // Size parameter is always needed even if we define the max document number.
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1676896611, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1676896611, 1)
}
>

 

将常规结合转换成capped collection

> db.runCommand({ "convertToCapped" : "log_old", size: 500000, max : 50 })
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1676896802, 3),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
},
"operationTime" : Timestamp(1676896802, 3)
} 

 

查询集合是否是capped collection

> db.log_old.isCapped()
true
> 

 

查询capped collection

mongodb可以保证按照文档的插入顺序检索capped collection。

> db.log_old.find().sort( { $natural: -1 } )

逆序返回结果:

> db.log_old.find().sort( { $natural: -1 } )

 

修改capped collection的大小

从MongoDB v6.0开始,可以修改capped collection的大小。然而在重新设置大小之前,要保证featureCompatibilityVersion至少被设置为6.0

db.runCommand( { collMod: "log", cappedSize: 100000 } ) //cappedSize should be in between 0 and 1PB.

否则会遇到以下错误:"unknown option to collMod: cappedSize"

> db.version()
4.4.16-16
rs1:PRIMARY> db.runCommand( { collMod: "logs", cappedSize: 100000 } )
{
"operationTime" : Timestamp(1678096200, 1),
"ok" : 0,
"errmsg" : "unknown option to collMod: cappedSize",
"code" : 72,
"codeName" : "InvalidOptions",
"$clusterTime" : {
"clusterTime" : Timestamp(1678096200, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
>

 

capped collection的优点

1.支持高插入吞吐量

2.存储日志信息很有用,按顺序保存

 

capped collection的缺点

1.不支持分片

2.没有TTL索引

 

总结

capped collection对于存储日志文件信息非常有用,因为它接近于将日志信息直接写入文件系统的速度,而且没有索引开销。

由于其稳定的性能,MongoDB本身使用capped collection来复制oplog.rs集合。

oplog.rs集合是一个特殊的capped collection,不能在其中创建索引、插入文档或删除集合。

capped collection有优点也有缺点,因此在使用之前,请确保了解应用程序的需求并做出相应的决定。

 

标签:Collection,MongoDB,clusterTime,db,collection,索引,文档,Capped,capped
From: https://www.cnblogs.com/abclife/p/17264528.html

相关文章

  • Day 21 21.3 数据库之MongoDB
    MongoDB一般爬虫使用的数据库,是根据项目来定的。如需求方指定了使用什么数据库、如果没指定,那么决定权就在爬虫程序员手里,如果自选的话,mysql和mongodb用的都是比较多的。但不同的数据库品种有各自的优缺点,不同的场景任何一种数据库都可以用来存储,但是某种可能会更好。......
  • Day 21 21.4 数据库之Python操作MongoDB
    PyMongo在这里我们来看一下Python3下MongoDB的存储操作,在本节开始之前请确保你已经安装好了MongoDB并启动了其服务,另外安装好了Python的PyMongo库。安装:pipinstallpymongo添加文档importpymongoclient=pymongo.MongoClient(host='localhost',port=27017)"""......
  • MongoDB 架构
    优质博文:IT-BLOG-CN一、存储数据格式MongoDB作为主流的NoSQL数据库之一,使用面向文档的数据存储方式,将数据以JSON和BSON的方式存储在磁盘中。BSONBinaryJSON是一种基于JSON的二级制序列化格式,用于MongoDB存储文档并进行远程过程调用,作为网络数据交互的一种存储形式,类似于Prot......
  • mongodb--文档查询
    一、简单查询--查询所有文档db.COLLECTION_NAME.find()--将查询结果以json形式显示db.COLLECTION_NAME.find().pretty()二、按条件查询文档db.COLLECTION_NAME.find(query,projection)参数说明:query:可选,projection:可选,查询时返回文档中所有键值,(默认省略)说明:按条件......
  • mongodb-文档的插入、更新与删除操作
    一、文档的插入--单文档插入db.COLLECTION_NAME.insert(document)db.COLLECTION_NAME.insertOne(document)--insert也可以插入多文档db.COLLECTION_NAME.save(document)--insert与save区别--insert方法插入若文档中已存在该文档,会报错,反之写入--save方法插入若集合中已......
  • mongodb--数据库操作与集合操作
    一、数据库操作1、新建数据库和切换数据库useDATABASE_NAME--DATABASE_NAME创建数据库的名字--如果刚创建完数据库,使用查看命令后没有的话,其实因为里面没有数据,所以才看不到2、查看所有数据库--查看所有数据库showdbs--查看当前数据库db 3、删除数据库--删除......
  • spring MongoDB 集成crud操作(简单封装)
    这两天一直在学习mongodb,由于我的博客网站想把mysql替换成mongodb,为什么会有这样的冲动,我通过收集一些资料,关于mongodb跟mysql的对比...发现性能上mongodb比上mysql是高出很多倍...无论是增,删,修,查的操作.....都比mysql效率好...但是,我也看到,mongodb是文档型数据库...做......
  • JAVA封装Mongodb操作之一:MongoRepository
    MongoRepository与HibernateTemplete相似,提供一些基本的方法,实现的方法有findone(),save(),count(),findAll(),findAll(Pageable),delete(),deleteAll(),基本就这几个,但是: 与HibernateRepository类似,通过继承MongoRepository接口,我们可以非常方便地实现对一个对象的增删改查,要使用R......
  • Tapdata Connector 实用指南:如何将 CRM 数据从 Salesforce 实时同步到 MongoDB 等其他
    【前言】作为中国的“Fivetran/Airbyte”,Tapdata是一个以低延迟数据移动为核心优势构建的现代数据平台,内置60+数据连接器,拥有稳定的实时采集和传输能力、秒级响应的数据实时计算能力、稳定易用的数据实时服务能力,以及低代码可视化操作等。典型用例包括数据库到数据库的复制......
  • windows安装mongodb,配置服务名,简化启动及遇到的问题
    1、官网下载官网地址:https://www.mongodb.com进到官网之后,Products->CommunitiServer(或者直接访问 https://www.mongodb.com/try/download/community )   ......