sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB grupperar alla nycklar och värden i en samling efter ett visst fält

Du är på rätt väg där.

När du konverterar hela objektet till en array, spara även fältet Kategori.

De steg som behövs:

  • $project för att spara kategorin och konvertera objektet till en array
  • $avveckla arrayen för att överväga varje fält separat
  • $match för att ta bort _id , Category och alla andra fält som du inte vill gruppera från arrayen
  • $gruppa efter Category och k för att trycka in värdena för varje nyckel i en array
  • $gruppa efter Category för att samla nycklarna och arrayerna
  • $project för att konvertera arrayen med insamlade värden till ett objekt
  • $addFields för att injicera kategorin i det nya objektet
  • $replaceRoot för att marknadsföra det nya objektet
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"}}
])

Lekplats




  1. Använder UUID istället för ObjectIDs i MongoDB

  2. Tillåter Redis endast strängrepresentation men inte numeriskt värde

  3. Mongo-fråga som använder mongoid i rails-appen som orsakar markör-timeout-fel

  4. Mongoose multi-uppdatering