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