Запустить агрегацию с помощью драйвера 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
типы.