J'ai une requête comme celle-ci (simplifiée):
db.report.aggregate([{
$match: {
main_id: ObjectId("58f0f67f50c6af16709fd2c7")
}
}, {
$group: {
_id: "$name",
count: {
$sum: 1
},
sum: {
$sum: {
$add: ["$P31", "$P32"]
}
}
}
}
])
Je fais cette requête à partir de Java et je veux la mapper sur ma classe, mais je ne veux pas que "_id" soit mappé sur le champ "nom". Parce que si je fais quelque chose comme ça:
@JsonProperty("_id")
private String name;
puis, lorsque je sauvegarde ces données sur Mongo (après quelques modifications), les données sont enregistrées sous le nom "_id", alors que je souhaite qu'un véritable identifiant soit généré.
Alors, comment puis-je renommer '_id' après l'opération $ group?
Vous pouvez y parvenir en ajoutant une étape $project
à la fin de votre pipeline, comme ceci:
{ $project: {
_id: 0,
name: "$_id",
count: 1,
sum: 1
}
}
essayez-le en ligne: mongoplayground.net/p/QpVyh-0I-bP
À partir de mongo v3.4, vous pouvez utiliser $addFields
en conjonction avec $project
pour éviter d'écrire tous les champs dans $project
qui pourraient être très fastidieux.
Cela se produit dans $project
car si vous incluez spécifiquement un champ, les autres champs seront automatiquement exclus.
Exemple:
{
$addFields: { my_new_id_name: "$_id" }
},
{
$project: { _id: 0 }
}
si vous utilisez la méthode find
, vous ne pouvez pas le faire, mais si vous utilisez aggregation
, c'est très simple, comme ceci:
db.collectionName.aggregate([
{
$project: {
newName: "$existingKeyName"
}
}
]);
db.report.aggregate(
{
$group: {_id: '$name'}
},
{
$project:{
name:"$_id",
_id:false} }
)