我有这样的查询(简化):
db.report.aggregate([{
$match: {
main_id: ObjectId("58f0f67f50c6af16709fd2c7")
}
}, {
$group: {
_id: "$name",
count: {
$sum: 1
},
sum: {
$sum: {
$add: ["$P31", "$P32"]
}
}
}
}
])
我从java做这个查询,我想把它映射到我的类,但我不希望'_id'映射到'name'字段。因为如果我做这样的事情:
@JsonProperty("_id")
private String name;
然后当我将这些数据保存回mongo时(经过一些修改)后,数据将保存为名称为“_id”,而我希望生成真实的Id。
那么,如何在$ group操作后重命名'_id'?
答案 0 :(得分:28)
您可以通过在管道末尾添加$project
阶段来实现此目的:
{ $project: {
_id: 0,
name: "$_id",
count: 1,
sum: 1
}
}
答案 1 :(得分:3)
从mongo v3.4开始,您可以将$addFields
与$project
结合使用,以避免在$project
中编写可能非常繁琐的所有字段。
这种情况发生在$project
,因为如果你特意包含一个字段,其他字段将被自动排除。
示例:
{
$addFields: { my_new_id_name: "$_id" }
},
{
$project: { _id: 0 }
}
答案 2 :(得分:1)
如果您使用的是find
方法,则无法执行此操作,但是如果您使用的是aggregation
,则非常简单:
db.collectionName.aggregate([
{
$project: {
newName: "$existingKeyName"
}
}
]);
答案 3 :(得分:0)
db.report.aggregate(
{
$group: {_id: '$name'}
},
{
$project:{
name:"$_id",
_id:false} }
)