在mongo的群组聚合之后是否可以重命名_id字段?

myk*_*ola 26 java mongodb

我有这样的查询(简化):

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)


use*_*001 5

 db.report.aggregate(   
{     
$group: {_id: '$name'} 
},
{
$project:{
  name:"$_id",
 _id:false} }
 )
Run Code Online (Sandbox Code Playgroud)