Java-драйвер mongodb скрывает поле идентификатора в операции агрегации/проекции

Я выполняю операцию агрегации с использованием драйвера java mongodb и следовал примеру из документации (вставленной ниже). В соответствии с этим поле _id должно быть скрыто. Однако, по моему опыту работы с моим собственным кодом, а также с выводом этого примера, поле _id не скрывается даже при установке значения проекции на 0 (оно работает из оболочки mongo). Кто-нибудь знает, является ли это ошибкой в ​​java-драйвере mongodb? Или я что-то делаю не так?

// create our pipeline operations, first with the $match
DBObject match = new BasicDBObject("$match", new BasicDBObject("type", "airfare") );

// build the $projection operation
DBObject fields = new BasicDBObject("department", 1);
fields.put("amount", 1);
fields.put("_id", 0);
DBObject project = new BasicDBObject("$project", fields );

// Now the $group operation
DBObject groupFields = new BasicDBObject( "_id", "$department");
groupFields.put("average", new BasicDBObject( "$avg", "$amount"));
DBObject group = new BasicDBObject("$group", groupFields);

// run aggregation
AggregationOutput output = collection.aggregate( match, project, group );

person Jeff Storey    schedule 14.01.2013    source источник


Ответы (1)


Поле _id, которое вы получаете в конце, принадлежит оператору $group. Если вы хотите переименовать его обратно в отдел, добавьте еще один $project в конец конвейера и переведите _id в отдел.

person Asya Kamsky    schedule 14.01.2013
comment
Я хочу скрыть поле _id все вместе, и я думал, что установка _id как 0 в проекции должна скрыть его. - person Jeff Storey; 14.01.2013
comment
Посмотрите на шаг $group — ему не передается _id, но вы говорите ему использовать $department в качестве _id (или ключа), по которому он будет группироваться. Исходный _id нет в вашем наборе результатов. - person Asya Kamsky; 14.01.2013
comment
Верно, но я вообще не хочу показывать _id в полученном json. Я хочу сгруппировать по отделам, но скрыть поле _id в выводе. - person Jeff Storey; 14.01.2013
comment
Как вы хотите, чтобы результат выглядел? Одно поле, называемое средним? Я предполагаю, что вам нужно два поля: одно называется отделом, а другое — средним. Итак, вам нужно $project _id на department - person Asya Kamsky; 14.01.2013
comment
Верно, мне бы хотелось, чтобы это было два поля: отдел и среднее, но чтобы оно было помечено как отдел, а не _id в json - person Jeff Storey; 14.01.2013
comment
О, вот что сказал ваш первоначальный ответ, теперь я вижу. Спасибо. - person Jeff Storey; 14.01.2013
comment
вот почему вам нужно добавить еще один шаг в конвейер, который будет (в json) {$project:{department:"$_id", average:1} } - person Asya Kamsky; 14.01.2013
comment
В этом случае, действительно ли проект что-то делает? Разве результат не будет таким же без него? - person Jeff Storey; 14.01.2013
comment
Он переименовывает поле _id, которое выходит из $group, в отдел. Некоторые прогнозы более сложные, чем другие. Это очень просто. - person Asya Kamsky; 14.01.2013