2016-03-14 90 views
0

使用MongoDB的外壳使用:使用Java驱动程序运行聚合 - MongoDB的

db.bios.aggregate(
[ 
{$match:{"contribs.0.name":{"$exists":1}}}, 
{$project: {contribs:{$arrayElemAt:["$contribs",0]}}} 
] 
) 

我怎样才能让使用Java驱动程序(2.14.1)相同的查询? 我尝试:

起初,我创建了一个DBOBJECT为$match阶段:

DBObject match = new BasicDBObject("$match",new BasicDBObject("contribs.0.name", 
       new BasicDBObject("$exists",1))); 

然后,我创建一个BasicDBList

BasicDBObject obj = new BasicDBObject("$contribs",0); 

BasicDBList arrayElemAt = new BasicDBList(); 
arrayElemAt.add(obj); 

这是$project阶段:

DBObject project1 = new BasicDBObject("$project", new BasicDBObject("contribs", 
        new BasicDBObject("$arrayElemAt",arrayElemAt))); 

最后我创建聚合通货膨胀管道:

List<DBObject> list = new ArrayList<>(); 
list.add(match); 
list.add(project1); 

AggregationOutput output = this.coll.aggregate(list); 

$Match阶段工作,但$project没有。

我得到一个错误:"errmsg" : "invalid operator '$contribs'" , "code" : 15999

回答

1

您创建了一个DBObject当你打算创建一个List。此外,DBList已被弃用一段时间。习惯使用标准列表符号:

List<DBObject> pipeline = Arrays.<DBObject>asList(
     new BasicDBObject(
      "$match", 
      new BasicDBObject(
       "contribs.0", new BasicDBObject("$exists",true) 
      ) 
     ), 
     new BasicDBObject(
      "$project", 
      new BasicDBObject(
       "contribs", new BasicDBObject("$arrayElemAt", Arrays.asList("$contribs",0)) 
      ) 
     ) 
    ); 

    AggregationOutput output = this.coll.aggrgate(pipeline); 

还要注意的是现代司机你真的应该全部到位DBObject类型的使用Document

+0

非常感谢。我被困了两个小时。我知道在Java Driver 3.0中有新功能,但是我用2.14.1开始了我的项目。然后,我将传递给Java驱动程序3.0+。 – DistribuzioneGaussiana