Ответ 1
Вы можете достичь этого, добавив этап $project
в конце вашего конвейера, например так:
{ $project: {
_id: 0,
name: "$_id",
count: 1,
sum: 1
}
}
попробуйте это онлайн: mongoplayground.net/p/QpVyh-0I-bP
У меня есть такой запрос (упрощенный):
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?
Вы можете достичь этого, добавив этап $project
в конце вашего конвейера, например так:
{ $project: {
_id: 0,
name: "$_id",
count: 1,
sum: 1
}
}
попробуйте это онлайн: mongoplayground.net/p/QpVyh-0I-bP
Из mongo v3.4 вы можете использовать $addFields
в сочетании с $project
, чтобы избежать записи всех полей в $project
, который может быть очень утомительным.
Это происходит в $project
, потому что если вы включаете в себя только поле, другие поля будут автоматически исключены.
Пример:
{
$addFields: { my_new_id_name: "$_id" }
},
{
$project: { _id: 0 }
}
Если вы используете метод find
вы не можете сделать это, но если вы используете aggregation
это очень просто, как это:
db.collectionName.aggregate([
{
$project: {
newName: "$existingKeyName"
}
}
]);
db.report.aggregate(
{
$group: {_id: '$name'}
},
{
$project:{
name:"$_id",
_id:false} }
)