sql >> Database >  >> NoSQL >> MongoDB

MongoDB groepeert alle sleutels en waarden in een verzameling op een bepaald veld

Daar ben je op de goede weg.

Sla bij het converteren van het hele object naar een array ook het veld Categorie op.

De benodigde fasen:

  • $project om de categorie op te slaan en het object naar een array te converteren
  • $wind de array af om elk veld afzonderlijk te beschouwen
  • $match om _id te verwijderen , Category en alle andere velden die u niet uit de array wilt groeperen
  • $groeperen op Category en k om de waarden van elke sleutel in een array te duwen
  • $groeperen op Category om de sleutels en arrays samen te verzamelen
  • $project om de array met verzamelde waarden naar een object te converteren
  • $addFields om de categorie in het nieuwe object te injecteren
  • $replaceRoot om het nieuwe object te promoten
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"}}
])

Speeltuin




  1. Uitzondering socket time-out in Mongo

  2. Hoe u de itemrangschikking in de lijst kunt krijgen, gesorteerd op meerdere velden in Mongoose

  3. MongoDB:Tellen hoeveel van elke afzonderlijke waarden er zijn?

  4. MongoDB:Hoe kan ik het loggen van de waarschuwing uitschakelen:ClientCursor::staticYield kan b/c van recursieve vergrendeling niet ontgrendelen?