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代码实现相关推荐

  1. 亿级别记录的mongodb批量导入Es的java代码完整实现

    针对mongodb亿级别或者十亿级别的模糊查询,效率不高,解决方式是使用Es查询,这样就需要把数据导入的ES中 完整的代码实现如下所示:(仅供参考) import java.io.IOExceptio ...

  2. es java bulk 导入数据一直超时_亿级别记录的mongodb批量导入ElasticSearch的java代码完整实现...

    针对mongodb亿级别或者十亿级别的模糊查询,效率不高,解决方式是使用ES查询,这样就需要把数据导入的ES中 完整的代码实现如下所示:(仅供参考) import java.io.IOExceptio ...

  3. oracle数据库 —— 分页查询 java代码实现

    分页查询的核心代码(理解这一句话很重要): prep = conn.prepareStatement("select * from (select t2.*,rownum rn from ( ...

  4. mysql多表联查分页_sqlserver多表联合查询和多表分页查询的代码讲解

    sqlserver多表联合查询和多表分页查询的代码讲解 发布时间:2020-05-14 14:42:07 来源:亿速云 阅读:700 作者:Leah 这篇文章主要为大家详细介绍了sqlserver多表 ...

  5. mongodb 百万_1亿条记录的MongoDB数据库随机查询性能测试

    mongdb性能压力测试,随机查询,数据量1亿条记录 操作系统centos6.4x64位 从测试结果看,当mongodb将数据全部载入到内存后,查询速度根据文档的大小,性能瓶颈通常会是在网络流量和CP ...

  6. MongoDB 分页查询的方法及性能

    这篇文章着重的讲讲MongoDB的分页查询 传统的SQL分页 传统的sql分页,所有的方案几乎是绕不开 row_number的,对于需要各种排序,复杂查询的场景,row_number就是杀手锏.另外, ...

  7. clickhouse 在货拉拉的应用实践,千亿级别数据实现秒级查询

    作者:扬大平仔 前携程.网易高级工程师,现为货拉拉高级工程师.热爱技术,敢于将新技术用于项目实践. 前言 为了解决线上问题定位慢,相应不及时等问题.所以我们决定开发一套智能问题定位系统.对于我们的一些 ...

  8. python mongodb分页查询_python数据库分页查询语句

    用django将数据从数据库提出并分页展示 不要笑这个太简单噢~~大神们路过的请自动忽略本文-- '''django有自带的分页功能,我这个是自己做的分页,效果其实是一样的. ''' 要把数据提出并展 ...

  9. idea2020shezhi代码检查级别_结合 CPU 理解一行 Java 代码是怎么执行的

    根据冯·诺依曼思想,计算机采用二进制作为数制基础,必须包含:运算器.控制器.存储设备,以及输入输出设备,如下图所示. 我们先来分析 CPU 的工作原理,现代 CPU 芯片中大都集成了,控制单元,运算单 ...

最新文章

  1. python使用界面-用python编写简单ui界面窗口
  2. html树形多选下拉列表,EasyUI 多行树形下拉框(Multiple ComboTree)_Vue EasyUI Demo
  3. 使用IDEA 创建SpringBoot项目
  4. linux下各权限的细分
  5. 质量运营在智能支付业务测试中的初步实践
  6. 28 CO配置-控制-产品成本控制-成本对象控制-期末结算-定义行标识
  7. lnmp改php版本,lnmp安装多版本PHP共存的方法详解
  8. 常见问题与常见算法的时间复杂度
  9. Linux-apache的编译安装1
  10. Tokenized的设计哲学(三)
  11. 遥感影像语义分割论文笔记(一)FarSeg CVPR2020
  12. Intellij创建自己的TODO
  13. 2019中国科大夏令营机试
  14. 零和对策matlab,零和对策
  15. 让AURIX Development Studio变得更好用
  16. 奥西400服务器维修,奥西TDS400故障代码
  17. html布局的wrap方法,wrap_content设置一个视图的尺寸为wr
  18. TCP协议为什么是三次握手而不是两次呢?
  19. 可以修改GPS的照片图像编辑器——Photos Exif Editor for Mac2.8特别版
  20. FX3U_定位控制_硬件连接

热门文章

  1. 《如何像证券交易员一样思考和行动》_学习笔记
  2. Redis 有序集合(zset)取交集(zinterstore)操作耗时测试
  3. php输出pre自动换行,解决 html pre 标签的内容自动换行的问题
  4. python最大堆_用Python实现最大堆
  5. 12无法使用otg_ios设备该如何选择U盘,以及U盘日常使用技巧
  6. Shell中常用的通配符
  7. 安徽省计算机二级大题教程,安徽省计算机二级例题
  8. 用python解决实际问题_Python解决实际问题一--备份文件
  9. mysql jdbc 协议_JDBC-MySql
  10. hmcl整合包导入_SSM实战第一篇_SSM的整合