mongodb上限集合

在MongoDB中,可以以循环方式将文档的插入顺序保留到集合中。 这些类型的集合在MongoDB中称为上限集合。 MongoDB文档描述了上限集合:

上限集合是固定大小的集合,它们支持高吞吐量操作,这些操作根据插入顺序来插入,检索和删除文档。 封顶的集合的工作方式类似于循环缓冲区:一旦集合填满了分配的空间,它就会通过覆盖集合中最旧的文件来为新文件腾出空间。”

好的,所以我们知道什么是上限集合,但是如何创建集合呢?

在MongoDB Shell中,我们将使用db.createCollection命令创建一个有上限的集合:

db.createCollection("logs", {capped: true,size: 4096,max:5})

该命令告诉MongoDB创建一个称为“日志”的集合,最大大小为4096字节,最多可容纳5个文档。 当添加第6个文档时,第一个文档将从集合中删除,确保该集合中最多只能有5个文档。 “ size”参数是必需的,但是“ max”参数是可选的。

在Java中,有两种与MongoDB进行通信的常用方法: MongoDB Java驱动程序以及Morphia (用于将Java对象映射到MongoDB或从MongoDB映射的轻量级类型安全映射库)。

首先,让我们首先来看一下Java驱动程序。

Java驱动

再次使用Java驱动程序,我们使用db.createCollection命令,这一次传递了BasicDBObject作为参数。 此参数具有字段“封顶”,“大小”和“最大”,这些字段指定对集合进行封顶,集合的最大大小(以字节为单位)和集合中的最大条目数。 以下代码段显示了如何连接到MongoDB的本地实例并创建上限集合。

MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://localhost"));
DB db = mongoClient.getDB("test");DBCollection collection;
if (!db.collectionExists("cappedLogsJavaDriver")) {BasicDBObject options = new BasicDBObject("capped", true);options.append("size", 4096);options.append("max", 5);collection = db.createCollection("cappedLogsJavaDriver", options);
} else {collection = db.getCollection("cappedLogsJavaDriver");
}

创建集合后,我们可以将文档插入其中以确保其按预期工作。 以下代码段显示了如何将8个文档插入到集合中(请记住,由于这是一个有上限的集合,因此将仅存储其中的最后5个)。

for (int i = 0; i < 8; i++) {BasicDBObject logEntry = new BasicDBObject("logId", i);collection.insert(logEntry);
}

使用MongoDB交互式外壳,我们可以验证现在存储在集合中的文档是否符合预期。

> db.cappedLogsJavaDriver.find()
{ "_id" : ObjectId("54a1ca44a82617da4f72e025"), "logId" : 3 }
{ "_id" : ObjectId("54a1ca44a82617da4f72e026"), "logId" : 4 }
{ "_id" : ObjectId("54a1ca44a82617da4f72e027"), "logId" : 5 }
{ "_id" : ObjectId("54a1ca44a82617da4f72e028"), "logId" : 6 }
{ "_id" : ObjectId("54a1ca44a82617da4f72e029"), "logId" : 7 }

摩菲亚

现在,我们已经了解了如何通过Java驱动程序创建集合,让我们看看如何使用Morphia来完成相同的事情。

Morphia的本质是将Java类映射到MongoDB或从MongoDB映射。 我们希望保留在MongoDB中的类使用@Entity注释进行注释,然后将其存储在通常以该类进行命名的集合中。 要创建一个有上限的集合,我们必须在@Entity注释上添加其他值,以指定集合中的最大条目数和集合的大小。 对与Java驱动程序示例中使用的对象类型相同的对象进行建模,我们将创建一个LogEntry类,如下所示:

@Entity(value="cappedLogsMorphia", cap=@CappedAt(count=5, value=4096))
public class LogEntry {private int logId;@Idprivate ObjectId id;public LogEntry(int logId) {this.logId = logId;}public int getLogId() {return logId;}public void setLogId(int logId) {this.logId = logId;}
}

我们可以看到该类以@Entity注释,指定该集合最多应包含5个文档和4096字节的大小。

使用Morphia,可以在启动时通过调用Morphia Datastore上的.ensureCaps .ensureCaps()方法来创建有上限的集合,如下所示。

MongoClient mongoClient = new MongoClient(new MongoClientURI("mongodb://localhost"));
DB db = mongoClient.getDB("test");Morphia morphia = new Morphia();
morphia.map(LogEntry.class);Datastore datastore = morphia.createDatastore(mongoClient, "test");
datastore.ensureCaps();

再次,和以前一样,我们可以将8个文档插入到集合中以验证仅存储了最后5个文档。

for (int i = 0; i < 8; i++) {LogEntry logEntry = new LogEntry(i);datastore.save(logEntry);
}
> db.cappedLogsMorphia.find()
{ "_id" : ObjectId("54a1ce9da82629642c64f5d9"), "className" : "com.davidsalter.cappedcollection.LogEntry", "logId" : 3 }
{ "_id" : ObjectId("54a1ce9da82629642c64f5da"), "className" : "com.davidsalter.cappedcollection.LogEntry", "logId" : 4 }
{ "_id" : ObjectId("54a1ce9da82629642c64f5db"), "className" : "com.davidsalter.cappedcollection.LogEntry", "logId" : 5 }
{ "_id" : ObjectId("54a1ce9da82629642c64f5dc"), "className" : "com.davidsalter.cappedcollection.LogEntry", "logId" : 6 }
{ "_id" : ObjectId("54a1ce9da82629642c64f5dd"), "className" : "com.davidsalter.cappedcollection.LogEntry", "logId" : 7 }

检查收集状态

在MongoDB中创建一个有上限的集合后,我们可以通过在Mongo DB交互式外壳程序中对该集合执行.stats()方法来检查其状态。

> db.cappedLogsJavaDriver.stats()
{"ns" : "test.cappedLogsJavaDriver","count" : 5,"size" : 180,"avgObjSize" : 36,"storageSize" : 4096,"numExtents" : 1,"nindexes" : 1,"lastExtentSize" : 4096,"paddingFactor" : 1,"systemFlags" : 1,"userFlags" : 0,"totalIndexSize" : 8176,"indexSizes" : {"_id_" : 8176},"capped" : true,"max" : 5,"ok" : 1
}

在这里,我们可以看到集合确实有上限(“ capped” = true),并且集合中的最大条目数为5(“ max” = 5)。

  • 本文中使用的示例的源代码可以在GitHub上找到 。

翻译自: https://www.javacodegeeks.com/2015/03/creating-a-mongodb-capped-collection-in-java.html

mongodb上限集合

mongodb上限集合_用Java创建MongoDB上限集合相关推荐

  1. 用Java创建MongoDB上限集合

    在MongoDB中,可以以循环方式将文档的插入顺序保留到集合中. 这些类型的集合在MongoDB中称为上限集合. MongoDB文档描述了上限集合: 上限集合是固定大小的集合,它们支持高吞吐量操作,这 ...

  2. mongodb 索引去重_朋友问你 MongoDB 是什么?给他看这篇就好了

    点击▲关注 "ITPUB"   给公众号标星置顶更多精彩 第一时间直达 来源:hello_锦泰blog.csdn.net/hayre/article/details/8062843 ...

  3. java 区块链使用_使用Java创建第一个区块链

    本系列教程的目的是帮助你了解如何开发区块链技术.在本教程中,我们将: 创建你的第一个非常基础的区块链. 实施简单的工作量证明系统(采矿). 探讨任何的可能性. 我假设你对面向对象编程有基本的了解.值得 ...

  4. Java中快速处理集合_简洁又快速地处理集合——Java8 Stream(上)

    作者:Howie_Y,系原创投稿 主页:www.jianshu.com/u/79638e5f0743 Java 8 发布至今也已经好几年过去,如今 Java 也已经向 11 迈去,但是 Java 8 ...

  5. java List最大_在java中获取List集合中最大的日期时间操作

    取list集合中最大的日期, 可以用date max = collections.max(datelist);, 传入一个日期集合, 就可以获取, 工作中有这个需求, 就查找到这个, 代码如下 } e ...

  6. java创建临时文件_用Java创建一个临时文件

    java创建临时文件 The task is to create a temporary file in Java. 任务是用Java创建一个临时文件. Creating a temporary fi ...

  7. java订单类_基于Java创建一个订单类代码实例

    这篇文章主要介绍了基于Java创建一个订单类代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 需求描述 定义一个类,描述订单信息 订单id 订 ...

  8. java订单类_使用Java创建一个订单类代码实例

    这篇文章主要简介了使用Java创建一个订单类代码实例,文中通过示例代码简介的非常具体,对大家的学习或者工作具有一定的参考学习网上卖,需要的朋友可以学习下 需求描述 定义一个类,描述订单信息 订单id ...

  9. java编程定义狗_用Java创建一条自己diy的狗狗类(6)

    21.这是用Java创建一条自己diy的狗狗类的源代码可以直接进行编译运行,希望大家能够从中获益良多. //gougou类文件 package test; public class gougou { ...

最新文章

  1. 位置信息网 http://www.LocationInfo.net
  2. 只导表前10条数据_【205期】面试官:数据量很大的情况下,对于分页查询你有什么优化方案吗?...
  3. GSON序列化时,日期格式问题处理
  4. xml文件转换成图片_如何把pdf文件转换成图片?
  5. Unity Package Manager Error的解决方案
  6. 【中文】Joomla1.7扩展介绍之eXtplorer(文件管理器)
  7. c++ printf怎么用_【经典】把脉printf中的C进阶技巧
  8. 一道Python面试题
  9. future java 多线程_Java多线程之Future与FutureTask
  10. 公路多孔箱涵设计_【公路常识中篇】公路路基边坡滑坡防护设计和预防
  11. Laravel框架一:原理机制篇
  12. led投影仪能换大功率灯吗_LED大功率洗墙灯怎么防水
  13. 戏说云计算之PaaS,IaaS,SaaS
  14. exchange无法收发邮件_SpringBoot2.x系列教程69--SpringBoot中整合Mail实现邮件发送
  15. Redis 官方可视化工具,功能真强大
  16. 监狱人员定位管理,提升智慧监狱信息化水平
  17. 【转载】嵌入式自学经历和体会
  18. python分割出两幅图像重叠区域代码
  19. cba篮球暂停次数和时间_CBA在比赛时,为什么有“官方暂停”?
  20. 《在远方》首播获佳绩 刘烨改行送快递马伊琍长发少女感MAX

热门文章

  1. ssl初一组周六模拟赛【2018.5.19】
  2. 【交互】【随机】Lost Root(CF1061F)
  3. WZK的排名(jzoj 1995)
  4. 【dfs】通行证(jzoj 2013)
  5. 森近林之助【字符串处理】
  6. 2-sat模板- 输出可行解
  7. 阿里面试,为什么Kafka不支持读写分离
  8. 彻底理解HashMap的元素插入原理
  9. JS实现星星评分功能实例代码(两种方法)
  10. mysql查询优化explain命令详解