2016-11-21 3 views
0

Я использую java-драйвер MongoDB 3.2.2 для выполнения некоторых операций агрегации, но я не уверен, что с ним можно добиться чего-то.Агрегация с использованием java-драйвера MongoDB

Исходный запрос в MongoDB является:

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

Я не имею ни малейшего представления о том, как поставить «$ конд» в качестве параметра оператора «$ сумма» в драйвере Java в секции кода ниже:

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

Я искал official document об этом безрезультатно, у кого есть опыт? Благодарю.

ответ

1

Для 3.x драйверов

Использование BsonDocument: типобезопасен Версия

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)) 
    ))); 

Использование документа - меньше кода, но не типобезопасен

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

Наконец, я использую класс Document для этого случая, спасибо за точное объяснение разницы! – realjin

0

Чтобы использовать $ cond в Java, используйте ArrayList.

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

// Чтобы добиться этого - [ "$ idcard.status", "нормальный"]

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

// Чтобы добиться этого - [{$ эк: [ "$ idcard.status" , "нормальный"]}, 1, 0]

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

// Наконец - {$ конд: [{$ эк: [ "$ idcard.status", "нормальный"]}, 1, 0]}

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

Также смотрите: MongoDB aggregation condition translated to JAVA driver

+0

BasicDBObject является для версии 2.x. BsonDocument и Document рекомендуется для версии драйвера 3.x. – Veeram

Смежные вопросы