MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB raggruppa tutte le chiavi e i valori in una raccolta in base a un determinato campo

Sei sulla strada giusta lì.

Quando si converte l'intero oggetto in una matrice, salvare anche il campo Categoria.

Le tappe necessarie:

  • $progetto per salvare la Categoria e convertire l'oggetto in un array
  • $svolgi l'array per considerare ogni campo separatamente
  • $match per rimuovere _id , Category e tutti gli altri campi che non desideri vengano raggruppati dall'array
  • $raggruppa per Category e k per inserire i valori di ciascuna chiave in un array
  • $raggruppa per Category per raccogliere le chiavi e gli array insieme
  • $project per convertire l'array con i valori raccolti in un oggetto
  • $addFields per inserire la categoria nel nuovo oggetto
  • $replaceRoot per promuovere il nuovo oggetto
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"}}
])

Parco giochi