0

J'essaie d'obtenir les résultats souhaités sur la plate-forme Java. Pour commencer, le cadre d'agrégation de MongoDB est assez nouveau pour moi. Donc, si la question semble triviale, veuillez pardonner. Mais j'ai essayé de chercher quelque chose de similaire mais en vain.Java + MongoDB: regrouper par nom et compter les valeurs de deux colonnes différentes en fonction de certains critères

La structure du document original est comme ceci:

{ 
    "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 
}, 

Je dois premier groupe par les documents en fonction du nom, puis appliquez un filtre sur les champs previousCount et currentCount et compter le nombre d'occurences pour que les conditions satisfont.

Donc, si je veux avoir des enregistrements distincts qui signifient le nombre de fois previousCount était > = 40 et < = 70 et currentCount était > = 10 et < = 50, je devrais obtenir quelque chose comme ceci:

Ainsi, je finirais veux des résultats tels que:

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

Comment dois-je procéder? Le cadre d'agrégation de MongoDB est quelque chose que je trouve difficile à comprendre et à appliquer. L'aide sera très appréciée car je suis coincé ici depuis longtemps. Merci beaucoup d'avance.

+0

Tout d'abord, avez-vous vérifié ce lien: https : //docs.mongodb.com/manual/reference/method/db.collection.aggregate/#examples? Deuxièmement, si vous êtes ou avez l'intention d'utiliser Spring Framework - alors je vous suggère de jeter un oeil à ce guide par mkyong: https://www.mkyong.com/mongodb/spring-data-mongodb-aggregation-grouping-example /. – Koshux

+0

Merci pour la réponse. Mais je n'ai pas l'intention d'utiliser Spring et le manuel auquel vous avez lié a donné des exemples pour compter un champ, et c'est le comptage simultané de deux champs qui me cause des problèmes. Désolé si j'ai manqué quelque chose. – Kunwar

Répondre

0

Vous pouvez essayer l'agrégation ci-dessous.

$group par name et $sum avec $cond conditions, lors du match Set 1 set autre 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 
     ] 
     } 
    } 
    } 
}) 

code 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

Merci beaucoup pour la réponse. La solution semble bonne. Si vous pouvez m'aider un peu plus et écrire un équivalent java, ce sera génial. Parce que c'est là que je suis principalement coincé, sur la restructuration de Java. – Kunwar

+0

Np. Mis à jour pour inclure le code Java. – Veeram

+0

Merci beaucoup pour la réponse rapide. Dans la dernière ligne cependant, il semble y avoir un problème. Il dit - impossible de résoudre la méthode 'aggregate (java.util.List )' – Kunwar