- MongoDB在单集合数据量达到八千万级时,在有索引的情况下查询时间长达40秒。故大量数据需要常常需要分表,分表后数据分布在很多集合中,此时查询可以设置条件边界。
- 即每个库查一次,但是每个库的查询条件不同,这种方法常常用在数据以时间分集合的库中。
聚合查询求平均值和总数的实例:
import com.google.gson.Gson;
import com.mongodb.*;
List<String> temp = new ArrayList<>();
temp.add(name1);
temp.add(name2);
BasicDBObject[] array = {
new BasicDBObject("name", new BasicDBObject("$in",temp)),//设置查询条件为name字段在temp列表里
new BasicDBObject("timestamp", new BasicDBObject("$gt",new Date("2010/4/12"))),
new BasicDBObject("timestamp", new BasicDBObject("$lte",new Date("2011/4/12"))) };
BasicDBObject cond = new BasicDBObject();
cond.put("$and", array);//设置array中三个条件为与关系
DBObject match = new BasicDBObject("$match", cond);
DBObject _group = new BasicDBObject("studentName", "$name");//使用name字段分组,并重新命名name字段为studentName
DBObject groupFields = new BasicDBObject("_id", _group);
groupFields.put("totalNum", new BasicDBObject("$sum", 1));//计算总数并命名为totalNum
groupFields.put("averageTime", new BasicDBObject("$avg", "$totalTime"));//计算totalTime的平均值并命名为averageTime
DBObject group = new BasicDBObject("$group", groupFields);
pipeline.add(match);
pipeline.add(group);
//查询,其中aggregate()可以有多种入参方式,查看源代码可知,有一种方法可以设置返回值类型为游标型,dbname为数据库名字
Cursor cursor1 = mongoTemplate.getCollection(dbname).aggregate(pipeline,AggregationOptions.builder().outputMode(AggregationOptions.OutputMode.CURSOR).build());
//遍历cursor1
//Student为实体类
DBObject obj1;
Student u = null;
while (cursor1.hasNext()) {
obj1 = cursor1.next();
try{
u = gson.fromJson(obj1.toString(), Student.class);
}catch (Exception e){
u = null;
}
}
Mongo数据库在3.5开始就必须指定返回方式,此处指定为游标方式。