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

MongoDB grupperer alle nøgler og værdier i en samling efter et bestemt felt

Du er på rette vej der.

Når du konverterer hele objektet til et array, skal du også gemme feltet Kategori.

De nødvendige stadier:

  • $project for at gemme kategorien og konvertere objektet til et array
  • $vind arrayet af for at overveje hvert felt separat
  • $match for at fjerne _id , Category og alle andre felter, du ikke ønsker grupperet fra arrayet
  • $gruppe efter Category og k at skubbe værdierne af hver nøgle ind i en matrix
  • $gruppe efter Category at samle nøglerne og arrays sammen
  • $project for at konvertere arrayet med indsamlede værdier til et objekt
  • $addFields for at injicere kategorien i det nye objekt
  • $replaceRoot for at promovere det nye objekt
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"}}
])

Legeplads




  1. MongoDB filtrerer kun efter array-egenskab, hvis den findes

  2. Dokument Læs og indsæt med låsning/transaktion i nodejs med mongodb

  3. Sådan håndteres uaktuelle forbindelser i MongoDB

  4. Node Mongo Native - hvordan kan man se, når en markør er udtømt?