前言:2018年的时候优化了一个项目,该项目从MOngodb中获取数据的时候一次去十万百万千万的数据过慢,往往每次都要二十秒,三十秒,今天提出了一个代码优化的方案

项目查从mongodb中获取数据:代码A

Query query = new Query();
queryAfter.addCriteria(Criteria.where("id").in(idList));
queryAfter.addCriteria(Criteria.where("time").gte(startTime).lte(endTime));
List<TestEntity> lists = mongoTemplate.find(queryBefore,TestEntity.class);

优化代码示例:代码B

 DBObject query1 = new BasicDBObject(); //setup the query criteria 设置查询条件
query1.put("id", new BasicDBObject("$in", idList));
query1.put("time", (new BasicDBObject("$gte", startTime)).append("$lte", endTime));
DBCursor dbCursor =mongoTemplate.getCollection("testEntity").find(query1);
List<TestEntity> list=new ArrayList<>();
while (dbCursor.hasNext()){
DBObject object=dbCursor.next();
TestEntity te=new TestEntity();
te.setId(object.get("_id").toString());
te.setTime((Date) object.get("time"));
list.add(te);
}

testEntity集合有25万条文档,查询出4万条文档转换成TestEntity实体类集合,代码A直接转换成实体要80秒 ,代码B的查询只要不到一秒钟!


扩展:

理解Java对象DBCursor

Java对象DBCursor表示MongoDB服务器中的一组文档.使用查找操作查询集合时,通常返回一个DBCursor对象,而不是向Java应用程序返回全部文档对象.

这样 能够在Java中受控的方式访问文档.

DBCursor对象以分批的方式从服务器取回文档,并使用一个索引来迭代文档.

在迭代期间,当索引达到前那批文档末尾时,将从服务器取回下批文档.

DBCursor实例提供的方法

方法

描述  
BatchSize(size) 指定每当读取到当前已下载的最后一个文档时,游标都将再返回多少个文档
Close() 关闭游标并释放它占用的服务器资源
Copy() 返回游标的拷贝
Count() 返回游标表示的文档数
hasNext() 如果游标中还有其他可供迭代的对象,就返回true
Iterator() 为游标创建一个迭代器对象
Limit(size) 指定游标可最多表示多少个文档
next() 为游标中中的下一个文档作为BDObject()返回,并将索引加一
Size() 计算与查询匹配的文档数,且不考虑limit()和skip()的影响
Skip(size) 在返回文档前,跳过指定数量的文档
Sort(sort) 按DBObject参数sort指定的方式对游标中的文档排序
toArray([max]) 从服务器检索所有的文档,并以列表的方式返回,如果指定了参数max,则只检索指定数量的文档

最新文章

  1. angularjs 新窗口打开
  2. linux命令初识
  3. python3 实现简单的信用卡还款,取款转账功能V2
  4. C语言写的流氓关机程序及破解
  5. 2.1Android底层开发需要哪些工具
  6. OpenSSL再爆多处高危漏洞
  7. linux云计算集群架构学习笔记:用户管理和root用户密码重置
  8. iPhone开发教程之retain/copy/assign/setter/getter
  9. Mac系统升级到10.9(mavericks)时安装php扩展问题解决(转)
  10. XCode中在提示窗体中对已弃用的API接口画上红线
  11. mybatis3.4测试CRUD
  12. React+Redux开发实战项目【美团App】,没你想的那么难
  13. Struts2笔记分享(一)
  14. Dynamics CRM 开启图表的3D效果展示
  15. 解决 python 读取文件乱码问题(UnicodeDecodeError)
  16. Linux下Power Management开发总结
  17. .Net使用RabbitMQ详解 转载http://www.cnblogs.com/knowledgesea/p/5296008.html
  18. [leetcode]Permutation Sequence @ Python
  19. sql server中截取字符串的常用函数
  20. python 单变量线性回归

热门文章

  1. POJ 3468 A Simple Problem with Integers(线段树区间更新)
  2. Python类私有方法的陷阱
  3. javaScript 检測 能否够连接指定server
  4. PowerDesigner中导入MYSQL数据库结构的步骤及问题解决
  5. ListView布局之View复用原理举例
  6. 浅析Netty原理
  7. C++中switch 语句中的变量声明和
  8. 速度上手LM4F LaunchPad 输出多路PWM波
  9. ios14--购物车优化2
  10. TensorFlow alexnet在华为Mate10上运行方法