Подтвердить что ты не робот

Можно ли переименовать поле _id после агрегации группы монго?

У меня есть такой запрос (упрощенный):

db.report.aggregate([{
        $match: {
            main_id: ObjectId("58f0f67f50c6af16709fd2c7")
        }
    }, {
        $group: {
            _id: "$name",
            count: {
                $sum: 1
            },
            sum: {
                $sum: {
                    $add: ["$P31", "$P32"]
                }
            }
        }
    }
])

Я делаю этот запрос из java, и я хочу отобразить его в своем классе, но я не хочу, чтобы "_id" отображался в поле "имя". Потому что если я сделаю что-то вроде этого:

@JsonProperty("_id")
private String name;

тогда, когда я сохраняю эти данные обратно в mongo (после некоторой модификации), данные сохраняются с именем как "_id", в то время как я хочу, чтобы был создан настоящий идентификатор.

Итак, как я могу переименовать '_id' после операции $group?

4b9b3361

Ответ 1

Вы можете достичь этого, добавив этап $project в конце вашего конвейера, например так:

{ $project: {  
      _id: 0,
      name: "$_id",
      count: 1,
      sum: 1
   }
}

попробуйте это онлайн: mongoplayground.net/p/QpVyh-0I-bP

Ответ 2

Из mongo v3.4 вы можете использовать $addFields в сочетании с $project, чтобы избежать записи всех полей в $project, который может быть очень утомительным.

Это происходит в $project, потому что если вы включаете в себя только поле, другие поля будут автоматически исключены.

Пример:

{ 
  $addFields: { my_new_id_name: "$_id" }
},
{
  $project: { _id: 0 }
}

Ответ 3

Если вы используете метод find вы не можете сделать это, но если вы используете aggregation это очень просто, как это:

db.collectionName.aggregate([
    {
        $project: {
            newName: "$existingKeyName"
        }
    }
]);

Ответ 4

 db.report.aggregate(   
{     
$group: {_id: '$name'} 
},
{
$project:{
  name:"$_id",
 _id:false} }
 )