0

使用 MongoDB shell 我使用:

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

4

1 回答 1

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

另请注意,在现代驱动程序中,您确实应该使用Document代替所有DBObject类型的驱动程序。

于 2016-03-14T21:08:08.527 回答