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