Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Đa cấp $group trong MongoDB Aggregate

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:

  1. $match: Lọc trước để giảm dữ liệu xử lý
  2. $group cấp 1: Nhóm theo cặp (Age, CountryName), đếm số lượng → tạo field count
  3. $group cấp 2: Nhóm theo Age, dùng $push tạo mảng các object {k: country, v: count}
  4. $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.