Запустить агрегацию с помощью драйвера Java - MongoDB

Используя оболочку 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);

Также обратите внимание, что в современных драйверах вы действительно должны использовать Document на месте всех DBObject типы.

Другие вопросы по тегам