Vous êtes sur la bonne voie.
Lors de la conversion de l'objet entier en tableau, enregistrez également le champ Catégorie.
Les étapes nécessaires :
- $project pour enregistrer la catégorie et convertir l'objet en tableau
- $déroulez le tableau pour considérer chaque champ séparément
- $match pour supprimer
_id
,Category
et tous les autres champs que vous ne voulez pas regrouper à partir du tableau - $grouper par
Category
etk
pour pousser les valeurs de chaque clé dans un tableau - $grouper par
Category
pour collecter les clés et les tableaux ensemble - $project pour convertir le tableau avec les valeurs collectées en un objet
- $addFields pour injecter la catégorie dans le nouvel objet
- $replaceRoot pour promouvoir le nouvel objet
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"}}
])