2016-11-21 113 views
0

我正在使用MongoDB java驱动程序3.2.2做一些聚合操作,但我不确定是否可以通过它实现某些功能。使用MongoDB java驱动程序的聚合

MongoDB中的原始查询为:

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

我不知道该怎样把“$ COND”为“$和”运算符的参数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

要在Java中使用$ cond,请使用ArrayList。

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

//要达致这 - [ “$ idcard.status”, “正常”]

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

//要达致这 - [{$ EQ: “$ idcard.status” , “正常”]},1,0]

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

//最后 - {$ COND:[{$当量:[ “$ 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