Estás en el camino correcto allí.
Al convertir todo el objeto en una matriz, guarde también el campo Categoría.
Las etapas necesarias:
- $proyecto para guardar la categoría y convertir el objeto en una matriz
- $desenrollar la matriz para considerar cada campo por separado
- $match para eliminar
_id
,Category
y cualquier otro campo que no desee agrupar de la matriz - $grupo por
Category
yk
para insertar los valores de cada clave en una matriz - $grupo por
Category
para recopilar las claves y las matrices juntas - $proyecto para convertir la matriz con valores recopilados en un objeto
- $addFields para inyectar la categoría en el nuevo objeto
- $replaceRoot para promocionar el nuevo objeto
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"}}
])