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后的代码就不写了,根据自己的业务需求做处理就好了