用Java创建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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器物理部署拓扑图,【网络】叶脊(Spine-Leaf)网络拓扑下全三层网络设计与实践(五)-物理服务器路由方案及配置...

5.1 本节目标理解物理机的业务ip之间的通信过程&#xff1b;了解如何在leaf交换机上配置业务ip的静态路由&#xff1b;了解如何在物理机上配置业务ip及其他相关配置项&#xff1b;5.2 拓扑结构本节拓扑结构与上节相比没有变化&#xff0c;如下图&#xff1a;5.3 物理机业务网络…

axios队列 vue_vue axios全攻略

不再继续维护vue-resource&#xff0c;并推荐大家使用 axios 开始&#xff0c;axios 被越来越多的人所了解。本来想在网上找找详细攻略&#xff0c;突然发现&#xff0c;axios 的官方文档本身就非常详细&#xff01;&#xff01;有这个还要什么自行车&#xff01;&#xff01;所…

linux内核模块简介

linux内核是一个整体是结构。因此向内核添加任何东西。或者删除某些功能 ,都十分困难。为了解决这个问题。引入了内核机制。从而可以动态的想内核中添加或者删除模块。模块不被编译在内核中,因而控制了内核的大小。然而模块一旦被插入内核,他就和内核其他部分一样。这样一来 就…

移动app显示远程服务器错误,KIS移动应用常见问题汇总

1、移动应用平台正式版登录后&#xff0c;变成试用版/已过期答&#xff1a;更新移动应用平台到最新版本V4.0.0.2&#xff0c;下载地址&#xff1a;http://dwz.cn/kis0268多次退出移动应用平台&#xff0c;直到变成正式版&#xff0c;重新启动移动应用。2、移动应用使用过程中提…

在@NamedQueries中枚举@NamedQuery

介绍 如果您是使用JPA的Java开发人员&#xff0c;则很可能在实体上声明了一个或多个NamedQuery对象。 要在类上声明NamedQuery &#xff0c;必须使用查询名称及其JPQL对该类进行简单注释&#xff0c;例如&#xff1a; Entity NamedQuery(name "findAllProjects",q…

csv转json文件

今天因为需要帮一个同事的新闻内容录入为html, 每次手改不方便&#xff0c;所以就弄了个csv(excel)转json的c程序&#xff0c;然后再利用ejs把它渲染成网页&#xff0c;打开渲染好的网页再保存(不能保存源文件&#xff0c;不然还是空的)&#xff0c;就可以把内容弄成一个html了…

探测服务器操作系统,探测服务器操作系统工具

探测服务器操作系统工具 内容精选换一换lib库获取方式不同&#xff0c;编译环境配置方法不同&#xff0c;下面分别介绍。根据Mind Studio安装服务器操作系统及架构与硬件环境是否相同&#xff0c;编译环境分为如下两种场景&#xff1a;若Mind Studio安装服务器操作系统及架构与…

Java Web App体系结构

我曾经利用Servlet&#xff0c;JSP&#xff0c;JAX-RS&#xff0c;Spring框架&#xff0c;Play框架&#xff0c;带有Facelets的JSF和一些Spark框架。 以我的拙见&#xff0c;所有这些解决方案都远非面向对象和优雅的。 它们都充满了静态方法&#xff0c;无法测试的数据结构和肮…

android listview使用自定义的adapter没有了OnItemClickListener事件解决办法

在使用listview的时用使用自定义的adapter的时候&#xff0c;如果你的item布局中包含有Button&#xff0c;Checkable继承来的所有控件&#xff0c;那么你将无法获取listview的onItemClickListener事件是由于Button&#xff0c;Checkable继承来的所有控件或默认获取焦点。解决办…

mysql用的是标准sql_标准SQL语言的用法_MySQL

SQL语言是目前最通用的关系数据库语言。ANSI SQL是指由美国国家标准局(ANSI)的数据库委员会制定的标准SQL语言&#xff0c;多数关系数据库产品支持标准SQL语言&#xff0c;但是它们也往往有各自的SQL方言。在分层的软件结构中&#xff0c;关系数据库位于最底层&#xff0c;它的…

三星有网络显示无网络连接到服务器,三星s5296连接了网络为什么不能用 看完这些原因就知道了...

1、无线网络本身有问题&#xff1a;如果手机连接上WiFi但却上不了网&#xff0c;首先要检查一下无线网络本身是否存在问题。这时候可以检查一下其他联网设备是否可以正常上网&#xff0c;如果可以的话&#xff0c;说明无线网络网络本身是没有问题的。如果其他联网设备也不能上网…

Mono for Android 篇二 使用Spinner 实现下拉列表读取Browser.BookmarksUri

http://www.cnblogs.com/ivanyb/archive/2013/03/05/2944818.html 1、首先在VS2010里面创建一个Android Application 简单说明一下解决方案中各个文件的作用&#xff1a; AndroidManifest.xml&#xff1a;项目环境配置文件&#xff0c;指明了使用Android SDK的版本&#xff0c;…

mysql不复制数据_windows mysql不停止服务复制数据

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

C++ 中的类模板

原文连接&#xff1a;http://see.xidian.edu.cn/cpp/biancheng/view/213.html 有时&#xff0c;有两个或多个类&#xff0c;其功能是相同的&#xff0c;仅仅是数据类型不同&#xff0c;如下面语句声明了一个类&#xff1a;class Compare_int{ public : Compare(int a,int b…

学生机房管理服务器系统设计,广东工业大学数据库课程设计机房管理系统设计...

《广东工业大学数据库课程设计机房管理系统设计》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《广东工业大学数据库课程设计机房管理系统设计(27页珍藏版)》请在人人文库网上搜索。1、课程设计个人报告课程名称 数据库应用与设计 _题目名称 机房管理系统 _学生学院 …

mysql磁盘临时表清理_mysql 创建大量磁盘临时表

发现 mysql 中创建的临时表基本都是磁盘临时表&#xff0c;对此进行排查。最后为临时表机制说明。通过查看 mysql 状态变量&#xff0c;看到创建的临时表基本都是磁盘临时表。查看临时表配置&#xff0c;默认配置 16M&#xff0c;配置并没有问题。创建两个表&#xff0c;做一个…

吃鸡服务器8月10日维护,《黑潮之上》2021年8月10日不停服维护公告

在黑潮之上手游中2021年8月10日更新了哪些有趣的内容呢&#xff1f;想了解本次更新情况如何的小伙伴们&#xff0c;接下来就让我们一起来看一下吧&#xff01;各位接触者:为了提供良好的游戏体验&#xff0c;保证服务器稳定运行&#xff0c;《黑潮之上》将于2021年8月10日早5:0…

资格赛:题目1:同构

时间限制:2000ms单点时限:1000ms内存限制:256MB描述 给定2个树A和B&#xff0c;保证A的节点个数>B的节点个数。 现在你需要对树A的边进行二染色。 一个好的染色方案&#xff0c;指不存在一个树A中的连通块&#xff0c;同时满足以下2个条件 1. 其中只有同色的边 2. 和B同构。…

如何使用Java 8 FlatMap JDBC ResultSet?

您还不喜欢机能吗&#xff1f; 这样标题可能不会引起您的共鸣-但文章会&#xff01; 相信我。 本质上&#xff0c;我们想要这样&#xff1a; ------------------ | col1 | col2 | col3 | ------------------ | A | B | C | row 1 | D | E | F | row 2 | G …

java 获取mysql链接_Java中如何获取mysql连接的3种方法总结

前言本文主要来说说三种 Java 中获取 mysql 连接的方式&#xff0c;分享出来供大家参考学习&#xff0c;下面话不多说了&#xff0c;来一起看看详细的介绍&#xff1a;第一种&#xff1a;传统的连接方式&#xff1b;第二种&#xff1a;读取配置文件方式&#xff1b;第三种&…