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

相关问题