0

我試圖在Java平臺上獲得所需的結果。 首先,MongoDB的聚合框架對我來說很新穎。所以如果這個問題看起來微不足道,請原諒。但我試圖尋找類似的東西,但無濟於事。Java + MongoDB:根據特定條件按兩個不同列的名稱和計數值進行分組

原來的文檔結構是這樣的:

{ 
    "name" : "WS1", 
    "previousCount" : 80, 
    "currentCount" : 70 
}, 
    { 
    "name" : "WS2", 
    "previousCount" : 42, 
    "currentCount" : 10 
}, 
    { 
    "name" : "WS2", 
    "previousCount" : 60, 
    "currentCount" : 40 
}, 
    { 
    "name" : "WS1", 
    "previousCount" : 60, 
    "currentCount" : 20 
}, 
    { 
    "name" : "WS3", 
    "previousCount" : 50, 
    "currentCount" : 10 
}, 
    { 
    "name" : "WS3", 
    "previousCount" : 30, 
    "currentCount" : 70 
}, 
    { 
    "name" : "WS1", 
    "previousCount" : 30, 
    "currentCount" : 30 
}, 
    { 
    "name" : "WS1", 
    "previousCount" : 80, 
    "currentCount" : 50 
}, 

我必須通過基於名字的文件第一組,然後塗於previousCount和CURRENTCOUNT領域過濾器和計數出現次數的數量條件滿足。

所以,如果我想有不同的記錄這意味着次數previousCount爲> = 40< = 70和CURRENTCOUNT是> = 10< = 50,我應該得到的東西像這樣:

因此我終於想類似的結果:

{ 
    "name" : "WS1", 
    "qualifiedPreviousCount" : 2, 
    "qualifiedCurrentCount" : 3 
}, 
    { 
    "name" : "WS2", 
    "qualifiedPreviousCount" : 2, 
    "qualifiedCurrentCount" : 2 
}, 
    { 
    "name" : "WS3", 
    "qualifiedPreviousCount" : 1, 
    "qualifiedCurrentCount" : 1 
}, 

我應該如何進行? MongoDB的聚合框架是我發現難以理解和應用的東西。我非常感謝幫助,因爲我長期呆在這裏。提前致謝。

+0

首先,你檢查出這個鏈接:HTTPS ://docs.mongodb.com/manual/reference/method/db.collection.aggregate/#examples?其次,如果你正在或打算使用Spring框架 - 那麼我建議你看看這個指南mkyong:https://www.mkyong.com/mongodb/spring-data-mongodb-aggregation-grouping-example /。 – Koshux

+0

感謝您的回覆。但我不打算使用Spring,並且您鏈接的手冊給出了計算一個字段的示例,並且這是兩個字段的同時計數導致了我的問題。對不起,我錯過了什麼。 – Kunwar

回答

0

您可以嘗試下面的聚合。

$group通過name$sum$cond與條件下,當比賽設置1,否則設置爲0。

db.collection_name.aggregate({ 
    "$group": { 
    "_id": "$name", 
    "qualifiedPreviousCount": { 
     "$sum": { 
     "$cond": [ 
      { 
      "$and": [ 
       { 
       "$gte": [ 
        "$previousCount", 
        40 
       ] 
       }, 
       { 
       "$lte": [ 
        "$previousCount", 
        70 
       ] 
       } 
      ] 
      }, 
      1, 
      0 
     ] 
     } 
    }, 
    "qualifiedCurrentCount": { 
     "$sum": { 
     "$cond": [ 
      { 
      "$and": [ 
       { 
       "$gte": [ 
        "$currentCount", 
        10 
       ] 
       }, 
       { 
       "$lte": [ 
        "$currentCount", 
        50 
       ] 
       } 
      ] 
      }, 
      1, 
      0 
     ] 
     } 
    } 
    } 
}) 

Java代碼:

MongoClient mongoClient = new MongoClient(); 
MongoDatabase db = mongoClient.getDatabase("db"); 
MongoCollection<Document> collection = db.getCollection("collection"); 
Bson aggregates = Aggregates.group("$name", 
       Arrays.asList(Accumulators.sum("qualifiedPreviousCount", new Document("$cond", Arrays.<Object>asList(new Document("$and", Arrays.<Object>asList(
         new Document("$gte", Arrays.<Object>asList("$previousCount", 40)), new Document("$gte", Arrays.<Object>asList("$previousCount", 70)) 
       )), 1, 0))), Accumulators.sum("qualifiedCurrentCount", new Document("$cond", Arrays.<Object>asList(new Document("$and", Arrays.<Object>asList(
         new Document("$gte", Arrays.<Object>asList("$currentCount", 10)), new Document("$gte", Arrays.<Object>asList("$currentCount", 50)) 
       )), 1, 0))))); 

List<Document> results = collection.aggregate(Arrays.asList(aggregates)).into(new ArrayList<>()); 
+0

非常感謝您的回覆。解決方案看起來不錯。如果你能夠幫助我多一點,並寫出一個相當於java的東西,那將會非常棒。因爲那是我主要被卡住的地方,所以重構這個Java。 – Kunwar

+0

Np。已更新爲包含Java代碼。 – Veeram

+0

非常感謝您的快速回復。儘管如此,似乎還有一個問題。它說 - 無法解析方法'聚合(java.util.List )' – Kunwar

相關問題