亿级别记录的mongodb分页查询java代码实现
1.准备环境
1.1 mongodb下载
1.2 mongodb启动
C:\mongodb\bin\mongod --dbpath D:\mongodb\data
1.3 可视化mongo工具Robo 3T下载
2.准备数据
<dependency><groupId>org.mongodb</groupId><artifactId>mongo-java-driver</artifactId><version>3.6.1</version></dependency>
java代码执行
public static void main(String[] args) {try {/**** Connect to MongoDB ****/// Since 2.10.0, uses MongoClientMongoClient mongo = new MongoClient("localhost", 27017);/**** Get database ****/// if database doesn't exists, MongoDB will create it for youDB db = mongo.getDB("www");/**** Get collection / table from 'testdb' ****/// if collection doesn't exists, MongoDB will create it for youDBCollection table = db.getCollection("person");/**** Insert ****/// create a document to store key and valueBasicDBObject document=null;for(int i=0;i<100000000;i++) {document = new BasicDBObject();document.put("name", "mkyong"+i);document.put("age", 30);document.put("sex", "f");table.insert(document);}/**** Done ****/System.out.println("Done");} catch (UnknownHostException e) {e.printStackTrace();} catch (MongoException e) {e.printStackTrace();}}
3.分页查询
传统的limit方式当数据量较大时查询缓慢,不太适用。考虑别的方式,参考了logstash-input-mongodb的思路:
publicdef get_cursor_for_collection(mongodb, mongo_collection_name, last_id_object, batch_size)collection = mongodb.collection(mongo_collection_name)# Need to make this sort by date in object id then get the first of the series# db.events_20150320.find().limit(1).sort({ts:1})return collection.find({:_id => {:$gt => last_id_object}}).limit(batch_size)endcollection_name = collection[:name]@logger.debug("collection_data is: #{@collection_data}")last_id = @collection_data[index][:last_id]#@logger.debug("last_id is #{last_id}", :index => index, :collection => collection_name)# get batch of events starting at the last_place if it is set last_id_object = last_idif since_type == 'id'last_id_object = BSON::ObjectId(last_id)elsif since_type == 'time'if last_id != ''last_id_object = Time.at(last_id)endendcursor = get_cursor_for_collection(@mongodb, collection_name, last_id_object, batch_size)
使用java实现
import java.net.UnknownHostException; import java.util.List;import org.bson.types.ObjectId;import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.mongodb.MongoClient; import com.mongodb.MongoException;public class Test {public static void main(String[] args) {int pageSize=50000;try {/**** Connect to MongoDB ****/// Since 2.10.0, uses MongoClientMongoClient mongo = new MongoClient("localhost", 27017);/**** Get database ****/// if database doesn't exists, MongoDB will create it for youDB db = mongo.getDB("www");/**** Get collection / table from 'testdb' ****/// if collection doesn't exists, MongoDB will create it for youDBCollection table = db.getCollection("person");DBCursor dbObjects; Long cnt=table.count();//System.out.println(table.getStats());Long page=getPageSize(cnt,pageSize);ObjectId lastIdObject=new ObjectId("5bda8f66ef2ed979bab041aa");for(Long i=0L;i<page;i++) {Long start=System.currentTimeMillis();dbObjects=getCursorForCollection(table, lastIdObject, pageSize);System.out.println("第"+(i+1)+"次查询,耗时:"+(System.currentTimeMillis()-start)/1000+"秒");List<DBObject> objs=dbObjects.toArray();lastIdObject=(ObjectId) objs.get(objs.size()-1).get("_id");} } catch (UnknownHostException e) {e.printStackTrace();} catch (MongoException e) {e.printStackTrace();}}public static DBCursor getCursorForCollection(DBCollection collection,ObjectId lastIdObject,int pageSize) {DBCursor dbObjects=null;if(lastIdObject==null) {lastIdObject=(ObjectId) collection.findOne().get("_id"); //TODO 排序sort取第一个,否则可能丢失数据}BasicDBObject query=new BasicDBObject();query.append("_id",new BasicDBObject("$gt",lastIdObject));BasicDBObject sort=new BasicDBObject();sort.append("_id",1);dbObjects=collection.find(query).limit(pageSize).sort(sort);return dbObjects;}public static Long getPageSize(Long cnt,int pageSize) {return cnt%pageSize==0?cnt/pageSize:cnt/pageSize+1;}}
4.一些经验教训
1. 不小心漏打了一个$符号,导致查询不到数据,浪费了一些时间去查找原因
query.append("_id",new BasicDBObject("$gt",lastIdObject)); 2.创建索引 创建普通的单列索引:db.collection.ensureIndex({field:1/-1}); 1是升续 -1是降续 实例:db.articles.ensureIndex({title:1}) //注意 field 不要加""双引号,否则创建不成功 查看当前索引状态: db.collection.getIndexes(); 实例: db.articles.getIndexes(); 删除单个索引db.collection.dropIndex({filed:1/-1});
3.执行计划
db.student.find({"name":"dd1"}).explain()
参考文献:
【1】https://github.com/phutchins/logstash-input-mongodb/blob/master/lib/logstash/inputs/mongodb.rb
【2】https://www.cnblogs.com/yxlblogs/p/4930308.html
【3】https://docs.mongodb.com/manual/reference/method/db.collection.ensureIndex/
转载于:https://www.cnblogs.com/davidwang456/p/9890377.html
亿级别记录的mongodb分页查询java代码实现相关推荐
- 亿级别记录的mongodb批量导入Es的java代码完整实现
针对mongodb亿级别或者十亿级别的模糊查询,效率不高,解决方式是使用Es查询,这样就需要把数据导入的ES中 完整的代码实现如下所示:(仅供参考) import java.io.IOExceptio ...
- es java bulk 导入数据一直超时_亿级别记录的mongodb批量导入ElasticSearch的java代码完整实现...
针对mongodb亿级别或者十亿级别的模糊查询,效率不高,解决方式是使用ES查询,这样就需要把数据导入的ES中 完整的代码实现如下所示:(仅供参考) import java.io.IOExceptio ...
- oracle数据库 —— 分页查询 java代码实现
分页查询的核心代码(理解这一句话很重要): prep = conn.prepareStatement("select * from (select t2.*,rownum rn from ( ...
- mysql多表联查分页_sqlserver多表联合查询和多表分页查询的代码讲解
sqlserver多表联合查询和多表分页查询的代码讲解 发布时间:2020-05-14 14:42:07 来源:亿速云 阅读:700 作者:Leah 这篇文章主要为大家详细介绍了sqlserver多表 ...
- mongodb 百万_1亿条记录的MongoDB数据库随机查询性能测试
mongdb性能压力测试,随机查询,数据量1亿条记录 操作系统centos6.4x64位 从测试结果看,当mongodb将数据全部载入到内存后,查询速度根据文档的大小,性能瓶颈通常会是在网络流量和CP ...
- MongoDB 分页查询的方法及性能
这篇文章着重的讲讲MongoDB的分页查询 传统的SQL分页 传统的sql分页,所有的方案几乎是绕不开 row_number的,对于需要各种排序,复杂查询的场景,row_number就是杀手锏.另外, ...
- clickhouse 在货拉拉的应用实践,千亿级别数据实现秒级查询
作者:扬大平仔 前携程.网易高级工程师,现为货拉拉高级工程师.热爱技术,敢于将新技术用于项目实践. 前言 为了解决线上问题定位慢,相应不及时等问题.所以我们决定开发一套智能问题定位系统.对于我们的一些 ...
- python mongodb分页查询_python数据库分页查询语句
用django将数据从数据库提出并分页展示 不要笑这个太简单噢~~大神们路过的请自动忽略本文-- '''django有自带的分页功能,我这个是自己做的分页,效果其实是一样的. ''' 要把数据提出并展 ...
- idea2020shezhi代码检查级别_结合 CPU 理解一行 Java 代码是怎么执行的
根据冯·诺依曼思想,计算机采用二进制作为数制基础,必须包含:运算器.控制器.存储设备,以及输入输出设备,如下图所示. 我们先来分析 CPU 的工作原理,现代 CPU 芯片中大都集成了,控制单元,运算单 ...
最新文章
- python使用界面-用python编写简单ui界面窗口
- html树形多选下拉列表,EasyUI 多行树形下拉框(Multiple ComboTree)_Vue EasyUI Demo
- 使用IDEA 创建SpringBoot项目
- linux下各权限的细分
- 质量运营在智能支付业务测试中的初步实践
- 28 CO配置-控制-产品成本控制-成本对象控制-期末结算-定义行标识
- lnmp改php版本,lnmp安装多版本PHP共存的方法详解
- 常见问题与常见算法的时间复杂度
- Linux-apache的编译安装1
- Tokenized的设计哲学(三)
- 遥感影像语义分割论文笔记(一)FarSeg CVPR2020
- Intellij创建自己的TODO
- 2019中国科大夏令营机试
- 零和对策matlab,零和对策
- 让AURIX Development Studio变得更好用
- 奥西400服务器维修,奥西TDS400故障代码
- html布局的wrap方法,wrap_content设置一个视图的尺寸为wr
- TCP协议为什么是三次握手而不是两次呢?
- 可以修改GPS的照片图像编辑器——Photos Exif Editor for Mac2.8特别版
- FX3U_定位控制_硬件连接
热门文章
- 《如何像证券交易员一样思考和行动》_学习笔记
- Redis 有序集合(zset)取交集(zinterstore)操作耗时测试
- php输出pre自动换行,解决 html pre 标签的内容自动换行的问题
- python最大堆_用Python实现最大堆
- 12无法使用otg_ios设备该如何选择U盘,以及U盘日常使用技巧
- Shell中常用的通配符
- 安徽省计算机二级大题教程,安徽省计算机二级例题
- 用python解决实际问题_Python解决实际问题一--备份文件
- mysql jdbc 协议_JDBC-MySql
- hmcl整合包导入_SSM实战第一篇_SSM的整合