2016-11-21 4 views
0

Ich verwende MongoDB Java-Treiber 3.2.2, um einige Aggregationsvorgänge durchzuführen, aber ich bin mir nicht sicher, ob damit etwas erreicht werden könnte.Aggregation mit MongoDB Java-Treiber

Die ursprüngliche Abfrage in MongoDB ist:

db.getCollection('report').aggregate({ 
$group: { 
    _id: "$company_id", 
    count: { 
      $sum: { 
        $cond: [{ 
          $eq: ["$idcard.status", "normal"] 
         },0,1] 
       } 
      } 
    } 
}) 

Ich habe keine Ahnung, wie als Parameter von "$ sum" Operator in Java-Treiber im Codeabschnitt unter dem "$ Cond" zu setzen:

 AggregateIterable<Document> res = col.aggregate(Arrays.asList(
      group("$company_id", 
        sum("count", ...) 
      ))); 

Ich habe die official document über diese ohne Ergebnis gesucht, hat jemand Erfahrung dabei? Vielen Dank.

Antwort

1

Für 3.x Treiber

Mit BsonDocument: Typ Sichere Version

BsonArray cond = new BsonArray(); 
BsonArray eq = new BsonArray(); 
eq.add(new BsonString("$idcard.status")); 
eq.add(new BsonString("normal")); 
cond.add(new BsonDocument("$eq", eq)); 
cond.add(new BsonInt64(0)); 
cond.add(new BsonInt64(1)); 

AggregateIterable<BsonDocument> aggregate = dbCollection.aggregate(Arrays.asList(
     group("$company_id", 
       sum("count", new BsonDocument("$cond", cond)) 
    ))); 

Mit Document - Weniger-Code aber nicht Typ Sicher

List cond = new ArrayList(); 
cond.add(new Document("$eq", Arrays.asList("$idcard.status", "normal"))); 
cond.add(0); 
cond.add(1); 

AggregateIterable<Document> aggregate = dbCollection.aggregate(Arrays.asList(
     group("$company_id", 
       sum("count", new Document("$cond", cond)) 
     ))); 
+0

Schließlich benutze ich die Document-Klasse für diesen Fall, danke für die genaue Erklärung des Unterschieds! – realjin

0

Um $ cond in Java zu verwenden, verwenden Sie ArrayList.

{ $cond: [ { $eq: ["$idcard.status", "normal"] },0,1] 

// Um ​​acheive dieses - [ "$ idcard.status", "normal"]

ArrayList eqArrayList = new ArrayList(); 
eqArrayList.add("$idcard.status"); 
eqArrayList.add("normal"); 

// Um ​​acheive dieses - [{$ eq: [ "$ idcard.status" , "normal"]}, 1, 0]

ArrayList condArray = new ArrayList(); 
condArray.add(new BasicDBObject("$eq", eqArrayList)); 
condArray.add(1); 
condArray.add(0); 

// Endlich - {$ Cond: [{$ eq: [ "$ idcard.status", "normal"]}, 1, 0]}

BasicDBObject fullCond = new BasicDBObject("$cond", condArray); 
siehe

auch: MongoDB aggregation condition translated to JAVA driver

+0

BasicDBObject ist für 2.x Treiberversion. BsonDocument und Document wird für 3.x-Treiberversion empfohlen. – Veeram