- 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 ,完成了。