あなたは正しい方向に進んでいます。
オブジェクト全体を配列に変換するときは、[カテゴリ]フィールドも保存します。
必要な段階:
- $ projectを使用してカテゴリを保存し、オブジェクトを配列に変換します
- $配列をアンワインドして、各フィールドを個別に検討します
- $ match to remove
_id
、Category
配列からグループ化したくないその他のフィールド - $ group by
Category
およびk
各キーの値を配列にプッシュするには - $ group by
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"}}
])