次のようなクエリがあります(簡略化)。
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」の名前を変更するにはどうすればよいですか?
これを行うには、パイプラインの最後に $project
ステージを次のように追加します。
{ $project: {
_id: 0,
name: "$_id",
count: 1,
sum: 1
}
}
オンラインで試してください: mongoplayground.net/p/QpVyh-0I-bP
Mongo v3.4から $addFields
と組み合わせて$project
すべてのフィールドを$project
それは非常に退屈なかもしれません。
これは$project
特定のフィールドを含めると、他のフィールドは自動的に除外されるためです。
例:
{
$addFields: { my_new_id_name: "$_id" }
},
{
$project: { _id: 0 }
}
find
メソッドを使用している場合はこれを行うことはできませんが、aggregation
を使用している場合は次のように非常に簡単です。
db.collectionName.aggregate([
{
$project: {
newName: "$existingKeyName"
}
}
]);
db.report.aggregate(
{
$group: {_id: '$name'}
},
{
$project:{
name:"$_id",
_id:false} }
)