Там сте на прав път.
Когато преобразувате целия обект в масив, запазете и полето Категория.
Необходимите етапи:
- $project за запазване на категорията и преобразуване на обекта в масив
- $развийте масива, за да разгледате всяко поле отделно
- $match за премахване на
_id
,Category
и всякакви други полета, които не искате групирани от масива - $group по
Category
иk
за да поставите стойностите на всеки ключ в масив - $group по
Category
за събиране на ключовете и масивите заедно - $project за преобразуване на масива със събраните стойности в обект
- $addFields за инжектиране на категорията в новия обект
- $replaceRoot за насърчаване на новия обект
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"}}
])