MongoDB使用游标MongoCursor查询海量数据
1.业务场景
大约70几万条MongoDB数据迁移到mysql
刚开始是先查询总数,然后再根据总数进行分页查询,如果数据量特别大,查询到后面的页会越来越慢,此种情况,可以根据实际情况,对数据进行排序查询后,查询条件加上大于上页最后一条数据的排序键来提升速度。
Date beginTime = DateUtil.parse(startDate + " 00:00:00", DateUtil.PATTERN_DATETIME);Date endTime = DateUtil.parse(endDate + " 23:59:59", DateUtil.PATTERN_DATETIME);//查询指定时间之间的数据Query query = new Query().addCriteria(Criteria.where("createTime").gte(beginTime).lte(endTime));query.with(new Sort(Sort.Direction.DESC,"createTime"));long amount = mongoTemplate.count(query, XXEntity.class);int page = (int)amount / PAGE_LIMIT;if(amount % PAGE_LIMIT > 0 ){//余数不为0时,要加1page += 1;}query.limit(PAGE_LIMIT);for(int i =0; i < page;i++){query.skip(i * PAGE_LIMIT);List entities = mongoTemplate.find(query, XXEntity.class);}
这里,我们使用mongo查询中更友好的查询方式:游标,来实现在mongo中对海量数据的查询。
Query query=new Query();query.addCriteria(Criteria.where("status").is(2).and("isDeleted").is(0));//指定查询集合MongoCursor cursor = mongoTemplate.getCollection("t_xxxxxxx")//组装查询条件.find(query.getQueryObject())//组装排序方式(非必须,可不设置).sort(query.getSortObject())//设置游标查询不超时.noCursorTimeout(true)//设置批量从数据库中获取的数据量.batchSize(2000).iterator();while (cursor.hasNext()){Document next = cursor.next();next.get("_id")}
这种方式70w条数据处理不到10分钟。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
