Bạn đang đi đúng hướng ở đó.
Khi chuyển đổi toàn bộ đối tượng thành một mảng, hãy lưu trường Category.
Các giai đoạn cần thiết:
- $ project để lưu Danh mục và chuyển đổi đối tượng thành một mảng
- $ giải phóng mảng để xem xét từng trường riêng biệt
- $ match để xóa
_id
,Category
và bất kỳ trường nào khác mà bạn không muốn được nhóm từ mảng - $ group theo
Category
vàk
để đẩy các giá trị của mỗi khóa vào một mảng - $ group theo
Category
để thu thập các khóa và mảng với nhau - $ dự án để chuyển đổi mảng có các giá trị đã thu thập thành một đối tượng
- $ addFields để đưa Danh mục vào đối tượng mới
- $ ReplaceRoot để quảng cáo đối tượng mới
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"}}
])