我有这样的查询(简化):
db.report.aggregate([{
$match: {
main_id: ObjectId("58f0f67f50c6af16709fd2c7")
}
}, {
$group: {
_id: "$name",
count: {
$sum: 1
},
sum: {
$sum: {
$add: ["$P31", "$P32"]
}
}
}
}
])
Run Code Online (Sandbox Code Playgroud)
我从java做这个查询,我想把它映射到我的类,但我不希望'_id'映射到'name'字段.因为如果我做这样的事情:
@JsonProperty("_id")
private String name;
Run Code Online (Sandbox Code Playgroud)
然后,当我将这些数据保存回mongo(经过一些修改)后,数据将保存为名称为"_id",同时我希望生成一个真实的Id.
那么,如何在$ group操作后重命名'_id'?
fel*_*lix 42
您可以通过$project在管道末尾添加一个阶段来实现此目的,如下所示:
{ $project: {
_id: 0,
name: "$_id",
count: 1,
sum: 1
}
}
Run Code Online (Sandbox Code Playgroud)
在线试用:mongoplayground.net/p/QpVyh-0I-bP
Man*_*lon 11
从mongo v3.4起,您可以$addFields结合使用$project以避免编写所有字段,$project因为这可能非常乏味。
发生这种情况的$project原因是,如果您专门包含一个字段,则其他字段将被自动排除。
例:
{
$addFields: { my_new_id_name: "$_id" }
},
{
$project: { _id: 0 }
}
Run Code Online (Sandbox Code Playgroud)
db.report.aggregate(
{
$group: {_id: '$name'}
},
{
$project:{
name:"$_id",
_id:false} }
)
Run Code Online (Sandbox Code Playgroud)