MongoDB定容集合(Capped Collection)

2023-12-27 02:44

本文主要是介绍MongoDB定容集合(Capped Collection),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

定容集合

定容集合行为

使用场景

限制和建议

使用方法

构建定容集合

查询

确定集合是否定容

将集合转换成定容集合

修改空间大小

修改文档数量限制

末尾持续游标(tailable cursor)


Mongodb的文档保存在集合当中,类似关系型数据库当中的表。用户对集合进行增删改查操作。

定容集合

定容集合,是一种固定大小的集合。支持数据的快速插入和按照插入顺序的高速读取。定容集合工作机制类似循环缓存。当集合大小达到用户指定的大小时,新插入的数据会覆盖最早插入的数据。

作为定容集合的替代方案,用户还可以选择定时索引。建立索引是指定索引数据的过期时间。当插入数据的时间索引字段超过过期时间后,mongodb或自动清除该数据。本文终点探讨定容集合,定时索引内容请参照其他文档。

定容集合行为

定容集合容量大小是确定的,并且保证数据按照插入顺序排列,因此具有下面的几个行为。

  • 数据按照插入时间排序,查询时无需构建其他时间字段索引来对文档查询顺序。因此提高了数据插入性能。
  • 自动删除最先插入的数据。当达到容量限制时,定容集合自动删除最先插入的数据,无需显示执行删除操作或额外的删除脚本。
  • 定容集合有_id字段和_id字段索引。

使用场景

针对定容集合高效插入和保证按照插入顺序读取数据的特性,定容集合适应下面两个场景

  1. 保存系统日志。 因为无需构建额外的索引,索引向定容集合插入数据时,具备与直接写入文件系统类似的性能。其先入先出的特性,保证了写入时间的顺序。因此适合用来保存系统日志。 mongodb的oplog就使用了定容集合。
  2. 将定容集合作为缓存,保存少量数据。

限制和建议

  • 自mongodb5开始,定容集合禁止使用snapshot读取方式
  • 当用户更新定容集合的数据时,可以添加索引避免全表扫描。当然,更新完成后,建议删除改索引。
  • 定容集合,不可分片
  • 使用默认排序可以高效的读取定容集合数据,这与在unix系统中使用tail方法读取日志文件类似。
  • 禁止使用$out方法向定容集合写入数据
  • 禁止在mongodb事务中向定容集合写入数据。

使用方法

构建定容集合

使用db.createCollection()方法,显式创建定容集合。定义定容集合时,必须指定集合空间大小。mongodb在分配定容集合存储空间时,按照256bytes的倍数来分配大小。mongodb计算出小于用户指定空间大小的最大的256的倍数。定容集合最大存储空间,不能超过1PB。

db.createCollection("<collectionName>", {capped: true, size: <collection_size>}) 

其中,collection_size的单位是字节(bytes)

db.createCollection("log", {capped: true, size: 100000})db.getCollectionInfos({name: "log"})
{"name" : "log","type" : "collection","options" : {"capped" : true,"size" : 100000},"info" : {"readOnly" : false,"uuid" : UUID("d11d3f1b-74ff-4dcc-89e3-e43051c8e3d7")},"idIndex" : {"v" : 2,"key" : {"_id" : 1},"name" : "_id_"}
}

除了指定集合空间大小之外,用户还可以指定集合文档的数量

db.createCollection("log", {capped: true, size:100000, max:500})db.getCollectionInfos({name: "log"})
{"name" : "log","type" : "collection","options" : {"capped" : true,"size" : 100000,"max" : 500},"info" : {"readOnly" : false,"uuid" : UUID("38120a0b-31e9-471e-a15d-45dbf3314323")},"idIndex" : {"v" : 2,"key" : {"_id" : 1},"name" : "_id_"}
}

定容集合中,必须指定大小。当定容集合容量已满而未达到用户指定的最大文档数量时,定容集合会删除最先插入的数据。

查询

使用find()方法查询定容集合。如果没有指定排列顺序,数据按照插入顺序返回。

db.cappedCollection.find()

如果查询插入数据的倒序,需要在查询语句中指定排列顺序。

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

确定集合是否定容

使用命令isCapped()查看一个集合是否是定容集合。

db.collection.isCapped()db.log.isCapped()
true

将集合转换成定容集合

使用命令convertToCapped, 将非定容集合转换成定容集合。但必须指定定容集合所占空间大小。集合转换为定容集合时,mongodb会为当前集合添加排它锁。其他人任何操作本集合的操作,需要等待定容集合转换完成

db.runCommand( {"convertToCapped": "<collection_name>", size: 100000})db.runCommand( {"convertToCapped": "books", size: 100000})db.books.isCapped()
true

修改空间大小

在collMod中,使用cappedSize指定定容集合空间大小。最大空间可超过1PB。

db.runCommand( {collMod: "log", cappedSize: 100000})

修改文档数量限制

在collMod中,使用cappedMax指定已有定容集合文档数量。当cappedMax值定义为负数或0时,没有文档数量限制。当指定的cappedMax数量小于当前定容集合文档数量时,定容集合会按照文档插入顺序,删除超过数量限制的文档。

db.runCommand( {collMod: "log", cappedMax: 500})

末尾持续游标(tailable cursor)

定容集合支持一种特殊的游标。当游标读取到最后一个文档后,该游标不会关闭,等到有新的数据插入到定容集合时,该游标返回新插入的数据,并保持开启状态。这与unix中的命令tail -f类似,直到文件结束,命令才终止。

tailableCursor比使用索引,按照插入的自然顺序返回数据。这样从头读取集合中的数据,对数据库和网络的开销是巨大的。但游标耗尽走到最后读取新插入的数据时,开销是微小的。

这篇关于MongoDB定容集合(Capped Collection)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/541645

相关文章

uva 11178 计算集合模板题

题意: 求三角形行三个角三等分点射线交出的内三角形坐标。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

Java基础回顾系列-第六天-Java集合

Java基础回顾系列-第六天-Java集合 集合概述数组的弊端集合框架的优点Java集合关系图集合框架体系图java.util.Collection接口 List集合java.util.List接口java.util.ArrayListjava.util.LinkedListjava.util.Vector Set集合java.util.Set接口java.util.HashSetjava

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

浅谈PHP5中垃圾回收算法(Garbage Collection)的演化

前言 PHP是一门托管型语言,在PHP编程中程序员不需要手工处理内存资源的分配与释放(使用C编写PHP或Zend扩展除外),这就意味着PHP本身实现了垃圾回收机制(Garbage Collection)。现在如果去PHP官方网站(php.net)可以看到,目前PHP5的两个分支版本PHP5.2和PHP5.3是分别更新的,这是因为许多项目仍然使用5.2版本的PHP,而5.3版本对5.2并不是完

Collection的所有的方法演示

import java.util.ArrayList;import java.util.Collection;import java.util.Iterator;public class TestCollection {/*** @param args* Collection的所有的方法演示* 此程序没有使用泛型,所以可以添加任意类型* 以后如果写到泛型会补充这一方面的内容*/public s

java集合的概述

集合就是一个容器,我们可以把多个对象放入的容器中。就像水杯(假设容量可以不断扩大)一样,你可以往水杯中不断地添加水,既然是水杯,你就不能往里添加沙子,也就是说集合中添加的对象必须是同一个类型的(引用类型,而不能是基本类型)。 看到集合的介绍会让我们的想起数组,那么集合和数组有什么区别呢? 首先,数组的大小是固定的,而集合理论上大小是不限的。 其次,数组既可以存储基本数据类型的数据,也可以存储

生产mongodb 分片与集群 方案

链接:http://my.oschina.net/pwd/blog/411439#navbar-header 注:主要是有一键安装的脚本可以借鉴

mongodb基本命令和Java操作API示例

1.Mongo3.2 java API示例:http://www.cnblogs.com/zhangchaoyang/articles/5146508.html 2.MongoDB基本命:http://www.cnblogs.com/xusir/archive/2012/12/24/2830957.html 3.java MongoDB查询(一)简单查询: http://www.cnblogs

使用jetty和mongodb做个简易文件系统

使用jetty和mongodb做个简易文件系统 - ciaos 时间 2014-03-09 21:21:00   博客园-所有随笔区 原文   http://www.cnblogs.com/ciaos/p/3590662.html 主题  MongoDB  Jetty  文件系统 依赖库: 1,jetty(提供http方式接口) 2,mongodb的java驱动(访问mo