Sei sulla strada giusta lì.
Quando si converte l'intero oggetto in una matrice, salvare anche il campo Categoria.
Le tappe necessarie:
- $progetto per salvare la Categoria e convertire l'oggetto in un array
- $svolgi l'array per considerare ogni campo separatamente
- $match per rimuovere
_id
,Category
e tutti gli altri campi che non desideri vengano raggruppati dall'array - $raggruppa per
Category
ek
per inserire i valori di ciascuna chiave in un array - $raggruppa per
Category
per raccogliere le chiavi e gli array insieme - $project per convertire l'array con i valori raccolti in un oggetto
- $addFields per inserire la categoria nel nuovo oggetto
- $replaceRoot per promuovere il nuovo oggetto
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"}}
])