mongo跨表及聚合查询

  • 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开始就必须指定返回方式,此处指定为游标方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值