2 votes

Convertir les valeurs en clés dans l'agrégation mongodb

Dans la mesure où MongoDB fournit $group dans le pipeline d'agrégation, il renvoie une liste de documents, où _id conserve une valeur de regroupement "distincte" et l'autre champ conserve un tableau de documents, regroupés selon une condition donnée.

Ce que je veux, c'est renvoyer un document unique dont les propriétés sont les résultats de l'agrégation.

Exemple de collecte :

{author: "Author1", title: "Title1"}
{author: "Author2", title: "Title2"}
{author: "Author2", title: "Title3"}

L'agrégation

db.getCollection('books').aggregate([ 
    {"$group": {
           _id: "$author",
           books: { $push: "$$ROOT" }
          }
    }
])

Cela me donne le résultat suivant :

{_id: 'Author1', books: [{author: "Author1", title: "Title1"}]},
{_id: 'Author2', books: [{author: "Author2", title: "Title2"}, {author: "Author2", title: "Title3"}]}

Mais j'aimerais obtenir les résultats sous la forme d'un seul objet, comme ceci :

{
  Author1: [
    {author: "Author1", title: "Title1"}
  ],
  Author2: [ 
    {author: "Author2", title: "Title2"},
    {author: "Author2", title: "Title3"}
  ]
}

En termes simples, je veux utiliser _id en tant que nouveau champ dans le document résultant, et la propriété appropriée $group pour des valeurs spécifiques _id doit être la valeur de la nouvelle variable.

Si quelqu'un est confronté à une telle question, veuillez l'aider ou lui donner des indices sur la façon de la résoudre. Merci d'avance.

4voto

Anthony Winzlet Points 10216

Vous pouvez essayer l'agrégation ci-dessous

db.getCollection('books').aggregate([ 
  { "$group": {
    "_id": "$author",
    "books": { "$push": "$$ROOT" }
  }},
  { "$group": {
    "_id": null,
    "data": {
      "$push": { "k": "$_id", "v": "$books" }
    }
  }},
  { "$replaceRoot": {
    "newRoot": { "$arrayToObject": "$data" }
  }}
])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X