2017-03-18 28 views
0

ich bauen eine Aggregation in MongoDBin DBObject in Java

{ 
    "$project": { 
     "dt": "$dt", 
     "mc": "$mc", 
     "uplift": "$uplift", 
     "baseAvg": "$baseAvg", 
     "baseUp": { $add: [ "$uplift", "$baseAvg" ] }, 
     "share": { 
      "$cond": [{ 
       "$eq": ["$baseAvg", 0] 
      }, 0, { 
       "$divide": ["$uplift", "$baseAvg"] 
      }] 
     } 
    } 
} 

Ich versuche, die Abfrage mithilfe DBObject zu bauen, da es keine ProjectOperation die Bedingung unterstützt ist. Aber ich bleibe stecken.

Wenn ich schreibe dies:

ArrayList condArray = new ArrayList(); 
     condArray.add(new BasicDBObject("$eq", new DBObject[] { new BasicDBObject("$baseAvg", 0) })); 
     condArray.add(0); 
     condArray.add(new BasicDBObject("$divide", new DBObject[] { new BasicDBObject("$uplift", "$baseAvg") })); 

     DBObject doc = new BasicDBObject("$baseAvg", 0); 


     DBObject operation = new BasicDBObject("$project", 
       new BasicDBObject(groupItem, "$_id." + groupItem) 
       .append("mc", "$mc") 
       .append("uplift", "$uplift") 
       .append("baseAvg", "$baseAvg") 
       .append("sumBaseUp", new BasicDBObject("$add", new DBObject[] {"$uplift", "$baseAvg"})) 
       .append("share", new BasicDBObject("$cond", condArray))); 

ich dies als Ergebnis:

{ 
    "$project": { 
     "dt": "$dt", 
     "mc": "$mc", 
     "uplift": "$uplift", 
     "baseAvg": "$baseAvg", 
     "sumBaseUp": { 
      "$add": [{ 
       "$uplift": "$baseAvg" 
      }] 
     }, 
     "share": { 
      "$cond": [{ 
       "$eq": [{ 
        "$baseAvg": 0 
       }] 
      }, 0, { 
       "$divide": [{ 
        "$uplift": "$baseAvg" 
       }] 
      }] 
     } 
    } 
} 

Jeder weiß, was ich tun sollte?

+0

Was ist Ihre Mongo-Java-Version? – Veeram

+0

@Veeram seine ** Java-Mongo-Treiber: 2.13.2 ** –

+0

Nur auf 3.2.0 aktualisiert seit meinem mongo Server ist auch 3,2 –

Antwort

1

Sie können die folgende Aggregationsabfrage für Mongo Java 2.13 Version verwenden. Ich habe einige Operationen vereinfacht.

List<DBObject> aggregates = Arrays.asList(new BasicDBObject("$project", new BasicDBObject("dt", "$dt"). 
      append("mc", "$mc"). 
      append("uplift", "$uplift"). 
      append("baseAvg", "$baseAvg"). 
      append("baseUp", new BasicDBObject("$add", Arrays.<Object>asList("$uplift", "$baseAvg"))). 
      append("share", new BasicDBObject("$cond", Arrays.<Object>asList(new BasicDBObject("$eq", Arrays.<Object>asList("$baseAvg", 0)), 
        0, new BasicDBObject("$divide", Arrays.<Object>asList("$uplift", "$baseAvg"))))))); 

Für Version 3.x können Sie unter Aggregation verwenden.

MongoClient mongoClient = new MongoClient(); 
MongoDatabase db = mongoClient.getDatabase("db"); 
MongoCollection<Document> collection = db.getCollection("collection"); 
Bson aggregates = Aggregates.project(Projections.fields(Projections.include("dt", "mc", "uplift","baseAvg"), 
       new Document("baseUp", new Document("$add", Arrays.<Object>asList("$uplift", "$baseAvg"))), 
       new Document("share", new Document("$cond", Arrays.<Object>asList(new Document("$eq", Arrays.<Object>asList("$baseAvg", 0)), 
             0, new Document("$divide", Arrays.<Object>asList("$uplift", "$baseAvg"))))))); 
List<Document> results = collection.aggregate(Arrays.asList(aggregates)).into(new ArrayList<>()); 
+0

vielen Dank @Veeram, es hat funktioniert! Hoffe es bald in den Frühlingsdaten zu sehen. –