Da sind Sie auf dem richtigen Weg.
Wenn Sie das gesamte Objekt in ein Array konvertieren, speichern Sie auch das Kategoriefeld.
Die benötigten Stufen:
- $project, um die Kategorie zu speichern und das Objekt in ein Array umzuwandeln
- $Entfernen Sie das Array, um jedes Feld separat zu betrachten
- $match zum Entfernen von
_id
,Category
und alle anderen Felder, die Sie nicht aus dem Array gruppieren möchten - $group nach
Category
undk
um die Werte jedes Schlüssels in ein Array zu schieben - $group nach
Category
um die Schlüssel und Arrays zusammen zu sammeln - $project um das Array mit gesammelten Werten in ein Objekt umzuwandeln
- $addFields, um die Kategorie in das neue Objekt einzufügen
- $replaceRoot, um das neue Objekt hochzustufen
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"}}
])