web-dev-qa-db-fra.com

Est-il possible de renommer le champ _id après l'agrégation de groupe de mongo?

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?

12
mykola

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

24
felix

À 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 }
}
2
Manuel Spigolon

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"
        }
    }
]);
0
andranikasl
 db.report.aggregate(   
{     
$group: {_id: '$name'} 
},
{
$project:{
  name:"$_id",
 _id:false} }
 )
0
Prasad Reddy