การจัดกลุ่มข้อมูลหลายระดับ (Multilevel Grouping) ใน MongoDB ทำได้ด้วยการใช้ $group หลายขั้นตอนใน aggregate pipeline ตัวอย่างนี้จัดกลุ่มตามอายุและประเทศ แล้วรวมประเทศเป็น object
สร้างคอลเลกชันและข้อมูลตัวอย่าง
> db.demo76.insertOne({ Name:"Chris","Age" : 21, "CountryName" : 'US' });
> db.demo76.insertOne({ Name:"Chris","Age" : 21, "CountryName" : 'US' });
> db.demo76.insertOne({ Name:"Chris","Age" : 23, "CountryName" : 'UK' });
> db.demo76.insertOne({ Name:"Chris","Age" : 23, "CountryName" : 'UK' });
> db.demo76.insertOne({ Name:"Chris","Age" : 21, "CountryName" : 'AUS' });
> db.demo76.insertOne({ Name:"Chris","Age" : 21, "CountryName" : 'AUS' });
> db.demo76.insertOne({ Name:"Chris","Age" : 23, "CountryName" : 'AUS' });
> db.demo76.insertOne({ Name:"Chris","Age" : 21, "CountryName" : 'UK' });
แสดงข้อมูลทั้งหมด
> db.demo76.find();
ผลลัพธ์: 8 เอกสาร ทั้งหมด Name="Chris" แยกตาม Age (21, 23) และ CountryName (US, UK, AUS)
Query Multilevel $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"
... }
... }}
... ]);
คำอธิบายขั้นตอน:
$match: กรองเฉพาะ Name="Chris"$groupระดับ 1: จัดกลุ่มตาม Age + CountryName นับจำนวน (count)$groupระดับ 2: จัดกลุ่มตาม Age เพียงอย่างเดียว รวมประเทศเป็น array ของ key-value pairs$addFields+$arrayToObject: แปลง array [{k,v}] เป็น object {CountryName: count}
ผลลัพธ์
{ "_id" : 23, "CountryName" : { "AUS" : 1, "UK" : 2 } }
{ "_id" : 21, "CountryName" : { "UK" : 1, "AUS" : 2, "US" : 2 } }
การตีความ:
- อายุ 23 ปี: AUS=1 คน, UK=2 คน
- อายุ 21 ปี: UK=1 คน, AUS=2 คน, US=2 คน
ประโยชน์: รูปแบบนี้เหมาะสำหรับรายงานสรุปข้อมูล (pivot table) ที่ต้องการดูการกระจายตัวของค่าต่างๆ หลายมิติ