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
enk
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"}}
])