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