您的位置:首页 > 数据库 > Mongodb

MongoDB高级查询[聚合Group]

2015-11-11 18:50 656 查看
Group

为了方便我还是把我的表结构贴上来:

Group大约需要一下几个参数。

key:用来分组文档的字段。和keyf两者必须有一个
keyf:可以接受一个javascript函数。用来动态的确定分组文档的字段。和key两者必须有一个
initial:reduce中使用变量的初始化
reduce:执行的reduce函数。函数需要返回值。
cond:执行过滤的条件。
finallize:在reduce执行完成,结果集返回之前对结果集最终执行的函数。可选的

这个主要是想 "通过渠道id查询到所有下属公司,并且不能重复" 所有要用 分组函数

看一下在Mongodb中的写法
db.getCollection('applications').group({
key:{
developer_id : true,
developer_name :true,
platform_id : true,
platform_name : true
},
initial:{
developer_id : true,
developer_name :true,
platform_id : true,
platform_name : true
},
$reduce:function(doc,prev){
prev.developer_id = doc.developer_id,
prev.developer_name = doc.developer_name,
prev.platform_id = doc.platform_id,
prev.platform_name = doc.platform_name
},
condition:{'platform_id':"b59fd3da-20e3-48ce-be18-7505e3f21127"}

})


下面我用Java对他们做一些测试。
/**
* 通过渠道id查询到所有下属公司,并不重复
* @param platformId
* @return
*/
@SuppressWarnings("unchecked")
public  List<Application> findDevByPlatformId(String platformId){
List<Application> devs = new ArrayList<Application>();
//reduce
StringBuffer reduce =  new StringBuffer();
reduce.append(" function(doc,prev){ ");
reduce.append("    prev.developer_id = doc.developer_id, ");
reduce.append("	   prev.developer_name = doc.developer_name,");
reduce.append("    prev.platform_id = doc.platform_id,");
reduce.append("    prev.platform_name = doc.platform_name");
reduce.append(" }");
//key
Map<String,Object> map1 = new HashMap<String,Object>();
map1.put("developer_id", true);
map1.put("developer_name", true);
map1.put("platform_id", true);
map1.put("platform_name", true);
//initial
Map<String,Object> map2 = new HashMap<String,Object>();
map2.put("developer_id", true);
map2.put("developer_name", true);
map2.put("platform_id", true);
map2.put("platform_name", true);

Query query = Query.query(Criteria.where("platform_id").is(platformId));
DBObject result = mongoTemplate.getCollection("applications").group(new BasicDBObject(map1),
query.getQueryObject(),new BasicDBObject(map2),reduce.toString());
Map<String,Application> map = result.toMap();
for (Map.Entry<String,Application> o : map.entrySet()) {
JSONObject jsonStu = JSONObject.fromObject(o.getValue());
Application app = (Application)JSONObject.toBean(jsonStu, Application.class);
if(app!=null){
System.out.println("developer_id="+app.getDeveloper_id()+
" developer_name="+app.getDeveloper_name());
}
}
return devs;
}


OK,完成了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: