Java對MongoDB進行分組操作並統計各個分組的數量


  最近在檢索MongoDB的數據時需要用到分組操作,由於沒有現成的說明文檔可參考,只能是在代碼中不斷調試、摸索前進;目前已現實了Java對MongoDB的分組操作,並統計各個分組的數量。現通過示例詳細解析,步驟如下流程所示:

(1)測試環境條件准備:MongoDB的版本為2.0.1,如下圖所示

(2)測試數據源准備:MongoDB的數據源示例如下圖所示

(3)測試示例過程:

  • 最初測試過程
1、示例代碼
public
void test(String guid) { String groupKey = "sex"; // 按性別來分組 GroupBy groupBy = new GroupBy(groupKey); final String COUNT = "count"; // 統計數量值的key,可以任意字符串,例如total DBObject initial = new BasicDBObject(); initial.put(COUNT, 0); // 初始值為0
// reduce必須要定義,否則調用MongoDB的group方法時會拋出異常 String reduce
= "function (document, output) { " + " output." + COUNT + "++; " // 統計數量值的key自增 + "}";
// 可以不用定義finalize變量 String finalize
= "function (output) {" + "return output;" + "}"; groupBy = groupBy.reduceFunction(reduce); // 必須要設置,不能為null,該函數的含義是在分組操作時定義一個操作文檔的聚合函數 groupBy = groupBy.collation(null); // 設置為null吧 groupBy = groupBy.finalizeFunction(finalize); // 可以設置為null,該函數的含義是在group函數返回最終值之前,定義一個運行每個分組的結果集的函數 groupBy = groupBy.initialDocument(initial.toString()); // 初始化分組統計數量 String criteriaKey = "guid"; // 過濾的條件 String criteriaValue = guid; // 過濾值 Criteria criteria = Criteria.where(criteriaKey).is(criteriaValue); String collectionName = "test_mongodb"; // MongoDB中數據集合名稱 GroupByResults<Map> mapGroupByResults = mongoTemplate.group(criteria, collectionName, groupBy, Map.class); logger.info(mapGroupByResults.toString()); }
變量groupBy的屬性值如下所示:

從上圖中可以看出代碼設置的值是有具體的含義的,可以明白這些值在group()函數中作用。
2、示例結果

從上圖中我們可以看出分組結果已出來了,根據guid為"2"的條件下按性別進行分組:男的有2人,女的也有2人。而guid為"2"的記錄總共有count=4.0,即4人。
需要注意的地方是,count=4.0的count屬性是GroupByResult自帶的,跟代碼中設置的final String COUNT="count"沒有關聯的,在下面的測試結果中會發現這種差別。
  • 修改測試過程
1、代碼稍作修改
public void test(String guid) { String groupKey = "sex"; GroupBy groupBy = new GroupBy(groupKey); final String COUNT = "total"; // 修改為total DBObject initial = new BasicDBObject(); initial.put(COUNT, 0); String reduce = "function (document, output) { " + " output." + COUNT + "++; " + "}"; // String finalize = "function (output) {" // + "return output;" // + "}"; groupBy = groupBy.reduceFunction(reduce); groupBy = groupBy.collation(null); // groupBy = groupBy.finalizeFunction(finalize); groupBy = groupBy.finalizeFunction(null); groupBy = groupBy.initialDocument(initial.toString()); String criteriaKey = "guid"; String criteriaValue = guid; Criteria criteria = Criteria.where(criteriaKey).is(criteriaValue); String collectionName = "test_mongodb"; GroupByResults<Map> mapGroupByResults = mongoTemplate.group(criteria, collectionName, groupBy, Map.class); logger.info(mapGroupByResults.toString()); }
變量groupBy的屬性值如下所示:

從上圖中可以看到細微的差別是:initial的value值由"{"count":0}”變為"{"total":0}",這是因為在代碼中修改了COUNT的賦值;此外,finalize也被賦值為null了,說明它對結果不會有影響。
2、測試結果

測試結果跟第一種的測試結果是類似的,只不過是通過關鍵字total來代表統計數量值了。

------20191209閃


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM