MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB gruppiert alle Schlüssel und Werte in einer Sammlung nach einem bestimmten Feld

Da sind Sie auf dem richtigen Weg.

Wenn Sie das gesamte Objekt in ein Array konvertieren, speichern Sie auch das Kategoriefeld.

Die benötigten Stufen:

  • $project, um die Kategorie zu speichern und das Objekt in ein Array umzuwandeln
  • $Entfernen Sie das Array, um jedes Feld separat zu betrachten
  • $match zum Entfernen von _id , Category und alle anderen Felder, die Sie nicht aus dem Array gruppieren möchten
  • $group nach Category und k um die Werte jedes Schlüssels in ein Array zu schieben
  • $group nach Category um die Schlüssel und Arrays zusammen zu sammeln
  • $project um das Array mit gesammelten Werten in ein Objekt umzuwandeln
  • $addFields, um die Kategorie in das neue Objekt einzufügen
  • $replaceRoot, um das neue Objekt hochzustufen
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"}}
])

Spielplatz