MongoDB高級查詢[聚合Group]

  • Group

爲了方便我還是把我的表結構貼上來:


Group大約需要一下幾個參數。

  1. key:用來分組文檔的字段。和keyf兩者必須有一個
  2. keyf:可以接受一個javascript函數。用來動態的確定分組文檔的字段。和key兩者必須有一個
  3. initial:reduce中使用變量的初始化
  4. reduce:執行的reduce函數。函數需要返回值。
  5. cond:執行過濾的條件。
  6. 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,完成了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章