前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MongoDB Capped Collection

MongoDB Capped Collection

作者头像
shysh95
发布2024-06-03 10:51:02
960
发布2024-06-03 10:51:02
举报
文章被收录于专栏:shysh95shysh95

Hi~朋友,关注置顶防止错过消息

如何创建Collection

MongoDB Collection可以理解为关系型数据库的表,当第一次在Collection存储数据或者创建索引时,如果该Collection不存在,则会首先创建该Collection,如下:

  1. db.myNewCollection2.insertOne( { x: 1} );
  2. db.myNewCollection3.createIndex( { y: 1} );

除了上述方式会创建Collection以外,我们可以通过Mongo的createCollection方法来创建,如下:

  1. db.createCollection(name, options);
  2. db.createCollection( <name>,
  3. {
  4. capped: <boolean>,
  5. timeseries: { // Added in MongoDB 5.0
  6. timeField: <string>, // required for time series collections
  7. metaField: <string>,
  8. granularity: <string>,
  9. bucketMaxSpanSeconds: <number>, // Added in MongoDB 6.3
  10. bucketRoundingSeconds: <number>// Added in MongoDB 6.3
  11. },
  12. expireAfterSeconds: <number>,
  13. clusteredIndex: <document>, // Added in MongoDB 5.3
  14. changeStreamPreAndPostImages: <document>, // Added in MongoDB 6.0
  15. size: <number>,
  16. max: <number>,
  17. storageEngine: <document>,
  18. validator: <document>,
  19. validationLevel: <string>,
  20. validationAction: <string>,
  21. indexOptionDefaults: <document>,
  22. viewOn: <string>,
  23. pipeline: <pipeline>,
  24. collation: <document>,
  25. writeConcern: <document>
  26. }
  27. )

name为Collection的名字,第二个参数为该Collection的一些参数,如果参数设置不同,集合类型也不同,每种集合类型后面详细说:

  • capped:如果设置为true,表示该集合是Capped Collection,同时要设置size参数,该集合不能分片
  • timeseries:创建时序Collction时需要指定
  • expireAfterSeconds: 为时序Collction和Cluster Collection指定Document的过期时间
  • clusteredIndex:指定Cluster Index
  • changeStreamPreAndPostImages:是否启用changeStream,启动以后可以记录Document的变更,类似MySQL的binlog
  • size:Capped Collection的最大size,Capped Collection达到最大Size以后旧的Document会被删除
  • max:Capped Collection的最大Document数量,size的优先级会更高
  • storageEngine:存储引擎,目前仅支持WiredTiger
  • validator:用于保证只要符合要求的Document才可以被插入到Collection中
  • validationLevel:用于定义validator的级别,默认有off、 strict和moderate三种值
  • validationAction:用于定义验证失败后的操作,是发出警告还是报错
  • indexOptionDefaults:指定集群索引的Option,storageEngine的Document
  • viewOn:创建视图是用来指定sourceCollection
  • pipeline:用于定义如何展示视图的数据
  • collation:指定集合的默认排序规则,设置完成以后无法修改
  • writeConcern:用来定义写操作需要等待多少个节点写入才认为操作成功

Collection在创建时会在库上获取一个独占锁,但该锁的时间一般比较短,当Collection创建完成以后就会自动释放。

如果在事务中创建collection,事务的readCorn必须指定为local,local代表读取本地节点上的最新数据,不等待数据复制到多个节点,这保证了集合创建的即时性,避免不必要的复制等待时间,从而降低创建集合的延迟。

创建Collection需要哪些权限

  • no-capped collection:需要在库上有createCollection或者collection有insert权限
  • capped collection:需要有convertToCapped的权限和在库上createCollection权限
  • view:需要在库上有createCollection权限

通常,mongodb中内置的readWrite角色就可以拥有以上权限,可以执行在库上执行集合上的任何操作。

Capped Collection

Capped Collection是一种有上限大小的集合(空间和Document数量),类似一个环,当触发限制时新的文档会覆盖旧的文档。

Capped Collection的限制

  • Capped Collection不可以被分片
  • 不能在Serverless的集群上使用
  • 该类型的集合不支持Stable API V1
  • 向Capped Collection写入数据时不允许使用事务
  • pipeline的$out目标集合不能是Capped Collection
  • 读取数据时不能使用snapshot的read concern

Capped Collection创建

  1. db.createCollection("log", { capped: true, size: 100000} )

size参数必须要指定,单位为bytes。

  • Capped Collection默认会有一个id字段和id字段索引
  • 避免在Capped Collection进行更新,更新会导致你的Collection超出配置的限制,会导致意想不到的结果
  • 在自然排序的查询中,查询速度相当于对一个log文件执行tail命令
  • 支持tailable cursor,相当于Unix的tail -f命令,可以在读取到Document结尾时继续等待新文档的写入,而不是关闭cursor
  • 在高并发场景下,MongoDB不保证Document的插入顺序

Capped Collection必须显示创建,不能通过insert数据的形式来创建。

其他类型的未shard的Collection可以通过convertToCapped命令将其转换为Capption类型,如下:

代码语言:javascript
复制
   
  db.runCommand({
  1. convertToCapped: "log2",
  2. size: 100000
  3. })

MongoDB 6.0以后Capped Collection支持修改size和max:

  • size必须大于0且小于1PB,如果设置的size小于当前Collection的大小,MongoDB会在下一次插入数据时删除超过大小的旧的文档
  • max如果小于等于0,表示不限制Document数目,如果max小于总Document的数目,MongoDB会在下一次插入数据时删除超过大小的旧的文档

修改方式如下:

  1. db.runCommand( { collMod: "log", cappedSize: 5242880} );
  2. db.runCommand( { collMod: "log", cappedMax: 5000} );

Capped Collection的弊端

Capped Collection在写入时需要串行写入,因此相比于普通的Collection来说具有更低的并发和更差的性能,并且通过TTL索引我们也可以实现Collection中数据的自动删除,因此Capped Collection的使用场景并不多,常用的一种场景就是日志的存储。

MongoDB中的副本集群中的oplog.rs的使用了Capped Collection,但是他的大小可以突破配置的大小。

Capped Collection查询

Capped Collection查询默认以插入数据的顺序进行返回,也就是最老的Document先返回,如果最近的先返回通过以下查询方式:

  1. db.log.find().sort( { $natural: -1} );

一张已存在的Collection可以通过isCapped()方法来检测是否是Capped Collection,如下:

  1. db.log.isCapped();
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员修炼笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档