mongodb查询遇到的问题

代码B通过使用DBCursor进行分批次查询,避免了mongoTemplate.find()一次性加载大量数据导致的内存压力。DBCursor在迭代过程中分批获取文档,减少了服务器资源消耗,尤其适用于大批量数据查询。优化后的查询方式提高了性能,降低了服务器崩溃的风险。
摘要由CSDN通过智能技术生成

代码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(优化后)

 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); 
12 }

大批量查询数据的情况下代码B会快很多,原因如下:

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

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

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

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

查询有性能问题,原因是mongoTemplate.find()会把查询结果全都塞到内存中,这样很危险,数据量一旦很大会冲垮服务器的,所以还是酌情使用。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,则只检索指定数量的文
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值