前言: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);
1 DBObject query1 = new BasicDBObject(); //setup the query criteria 设置查询条件
2 query1.put("id", new BasicDBObject("$in", idList));
3 query1.put("time", (new BasicDBObject("$gte", startTime)).append("$lte", endTime));
4 DBCursor dbCursor =mongoTemplate.getCollection("testEntity").find(query1);
5 List<TestEntity> list=new ArrayList<>();
6 while (dbCursor.hasNext()){
7 DBObject object=dbCursor.next();
8 TestEntity te=new TestEntity();
9 te.setId(object.get("_id").toString());
10 te.setTime((Date) object.get("time"));
11 list.add(te);
testEntity集合有25万条文档,查询出4万条文档转换成TestEntity实体类集合,代码A直接转换成实体要80秒 ,代码B的查询只要不到一秒钟!
理解Java对象DBCursor
Java对象DBCursor表示MongoDB服务器中的一组文档.使用查找操作查询集合时,通常返回一个DBCursor对象,而不是向Java应用程序返回全部文档对象.
这样 能够在Java中受控的方式访问文档.
DBCursor对象以分批的方式从服务器取回文档,并使用一个索引来迭代文档.
在迭代期间,当索引达到前那批文档末尾时,将从服务器取回下批文档.
DBCursor实例提供的方法
方法