MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB groupe toutes les clés et valeurs d'une collection par un certain champ

Vous êtes sur la bonne voie.

Lors de la conversion de l'objet entier en tableau, enregistrez également le champ Catégorie.

Les étapes nécessaires :

  • $project pour enregistrer la catégorie et convertir l'objet en tableau
  • $déroulez le tableau pour considérer chaque champ séparément
  • $match pour supprimer _id , Category et tous les autres champs que vous ne voulez pas regrouper à partir du tableau
  • $grouper par Category et k pour pousser les valeurs de chaque clé dans un tableau
  • $grouper par Category pour collecter les clés et les tableaux ensemble
  • $project pour convertir le tableau avec les valeurs collectées en un objet
  • $addFields pour injecter la catégorie dans le nouvel objet
  • $replaceRoot pour promouvoir le nouvel objet
db.collection.aggregate([
  {$project: {
      Category: 1,
      fields: {$objectToArray: "$$ROOT"}
  }},
  {$unwind: "$fields"},
  {$match: {"fields.k": {$not: {$in: ["_id","Category"]}} }},
  {$group: {
      _id: {
        Category: "$Category",
        key: "$fields.k"
      },
      value: {$push: "$fields.v"}
  }},
  {$group: {
      _id: "$_id.Category",
      fields: {
        $push: {
          "k": "$_id.key",
          "v": "$value"
        }
      }
  }},
  {$project: {
      fields: {$arrayToObject: "$fields"}
  }},
  {$addFields: {
      "fields.Category": "$_id"
  }},
  {$replaceRoot: { newRoot: "$fields"}}
])

Aire de jeux