1. 程式人生 > >mongodb分片集合不支援group操作解決之mapreduce的使用

mongodb分片集合不支援group操作解決之mapreduce的使用

首先說一下分片:

分片(sharding)是指將資料拆分,將其分散存放在不同的機器上的過程。有時也用分割槽(partitioning)來表示這個概念。將資料分散到不同的機器上,不需要功能強大的大型計算機就可以儲存更多的資料,處理更大的負載。

這裡不講怎麼操作分片有興趣自己百度

那麼分片之後的集合是不支援group操作的 會報錯,為解決這個問題 使用map reduce操作

首先上個簡單的例子然大家瞭解一下map reduce的使用

這段程式碼的意思是 按照probMac欄位分組 統計條數
    public Object groupByMapReduce(String key) {
        String map = "function() { emit(this.probMac, {count:1});}";  //this 代表當前集合 probMac是集合中的一個欄位名字
        String reduce = "function(key, values) {"
                + "var total = 0;"
                + "for(var i=0;i<values.length;i++){total += values[i].count;}"
                + "return {count:total};}";
        
        MapReduceResults<XX> mrr = mongoTemplate.mapReduce("customer", map, reduce, XX.class);//customer 集合名字
        return mrr.iterator();//返回的是個迭代器 只要 while(hasNext()){  ...... }就可以取結果了
    }

返回的是這樣一個結果[{"_id":"141FBA789010","value":{"count":505.0}},{"_id":"141FBA789050","value":{"count":18287.0}},{"_id":"141FBA789098","value":{"count":7489.0}},{"_id":"141FBA7890E8","value":{"count":8626.0}}]

那麼可能有人會問 我想加入查詢條件怎麼辦呢?當然是有解決方案的

mongoTemplate.mapReduce 有多個過載的 其中有一個

/**

*@param query 這個引數可以放你的查詢條件了

*@param inputCollectionName 你要操作的集合名稱

*@param mapFunction map函式字串

*@param reduceFunction reduce函式字串

*@param entityClass 查詢結果放入什麼物件

*/

public <T> MapReduceResults<T> mapReduce(Query query, String inputCollectionName, String mapFunction,
      String reduceFunction, Class<T> entityClass) {
   return mapReduce(query, inputCollectionName, mapFunction, reduceFunction, new MapReduceOptions().outputTypeInline(),
         entityClass);
}

好了 簡單的例子大家是不是瞭解了呢?如果有幫助 希望點個贊吧