MongoDB cho phép sử dụng nhiều stage $group liên tiếp (multilevel grouping) để thực hiện các phép tổng hợp phức tạp, ví dụ: nhóm theo nhiều cấp độ và chuyển đổi cấu trúc dữ liệu.
Dữ liệu mẫu
8 document với Name="Chris", các cặp Age/CountryName khác nhau: Age=21, Country=US (2 doc) Age=23, Country=UK (2 doc) Age=21, Country=AUS (2 doc) Age=23, Country=AUS (1 doc) Age=21, Country=UK (1 doc)
Pipeline aggregate 3 stage $group
> db.demo76.aggregate([
... { "$match": { "Name": "Chris" }},
... { "$group": {
... "_id": { "Age": "$Age", "CountryName": "$CountryName" },
... "count": { "$sum": 1 }
... }},
... { "$group": {
... "_id": "$_id.Age",
... "CountryName": {
... "$push": {
... "k": "$_id.CountryName",
... "v": "$count"
... }
... }
... }},
... { "$addFields": {
... "CountryName": { "$arrayToObject": "$CountryName" }
... }}
... ]);
Kết quả
{ "_id" : 23, "CountryName" : { "AUS" : 1, "UK" : 2 } }
{ "_id" : 21, "CountryName" : { "UK" : 1, "AUS" : 2, "US" : 2 } }
Giải thích từng stage:
- $match: Lọc trước để giảm dữ liệu xử lý
- $group cấp 1: Nhóm theo cặp (Age, CountryName), đếm số lượng → tạo field
count - $group cấp 2: Nhóm theo Age, dùng
$pushtạo mảng các object {k: country, v: count} - $addFields + $arrayToObject: Chuyển mảng key-value thành object {AUS:1, UK:2...}
Kỹ thuật này hữu ích cho báo cáo pivot table, ma trận dữ liệu.