group是较为复杂的聚合操作,与关系型数据库中的group by类似。
group先选定分组依据的键,然后将集合根据键值分组,之后再聚合每一组内的数据产生查询结果。
//MongoDB db.coll.group({ 'key':{//分组依据 'a':true }, 'cond':{'active':1},//查询条件 'reduce': function(obj,prev)//聚合操作 { prev.csum += obj.c; }, 'initial':{'csum':0}//指定聚合计数器的初始对象 });
下面是在Java中的处理方法:
//统计函数 由js实现 String reduce = "function(doc, prev){" + " prev.csum += 1;" + " }"; Query query = Query.query(Criteria.where("active").exists(true)); DBObject result = mongoTemplate.getCollection("XXX").group(new BasicDBObject("a", true), query.getQueryObject(), new BasicDBObject("csum", 0), reduce);//MongoTemplate是spring提供操作mongoDB的 Map<String,Map<String,Double>> map = result.toMap();
得到Map后的代码就不写了,根据自己的业务需求做处理就好了