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); }
好了 簡單的例子大家是不是瞭解了呢?如果有幫助 希望點個贊吧