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

时间:2017-04-21 08:43:11

标签: java mongodb

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

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'?

4 个答案:

答案 0 :(得分:28)

您可以通过在管道末尾添加$project阶段来实现此目的:

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

在线试用:mongoplayground.net/p/QpVyh-0I-bP

答案 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} }
 )