Jste na správné cestě.
Při převodu celého objektu na pole uložte také pole Kategorie.
Potřebné fáze:
- $project pro uložení kategorie a převedení objektu na pole
- $rozviňte pole a zvažte každé pole samostatně
- $match k odstranění
_id
,Category
a všechna další pole, která nechcete seskupovat z pole - $group by
Category
ak
vložit hodnoty každého klíče do pole - $group by
Category
sbírat klíče a pole dohromady - $project pro převod pole se shromážděnými hodnotami na objekt
- $addFields pro vložení kategorie do nového objektu
- $replaceRoot k propagaci nového objektu
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"}}
])