web-dev-qa-db-ja.com

mongoのグループ集約後に_idフィールドの名前を変更することは可能ですか?

次のようなクエリがあります(簡略化)。

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」の名前を変更するにはどうすればよいですか?

30
mykola

これを行うには、パイプラインの最後に $project ステージを次のように追加します。

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

オンラインで試してください: mongoplayground.net/p/QpVyh-0I-bP

24
felix

Mongo v3.4から $addFields と組み合わせて$projectすべてのフィールドを$projectそれは非常に退屈なかもしれません。

これは$project特定のフィールドを含めると、他のフィールドは自動的に除外されるためです。

例:

{ 
  $addFields: { my_new_id_name: "$_id" }
},
{
  $project: { _id: 0 }
}
2
Manuel Spigolon

findメソッドを使用している場合はこれを行うことはできませんが、aggregationを使用している場合は次のように非常に簡単です。

db.collectionName.aggregate([
    {
        $project: {
            newName: "$existingKeyName"
        }
    }
]);
0
andranikasl
 db.report.aggregate(   
{     
$group: {_id: '$name'} 
},
{
$project:{
  name:"$_id",
 _id:false} }
 )
0
Prasad Reddy