Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

Multilevel $group ใน MongoDB Aggregation

การจัดกลุ่มข้อมูลหลายระดับ (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"
...   }
... }}
... ]);

คำอธิบายขั้นตอน:

  1. $match: กรองเฉพาะ Name="Chris"
  2. $group ระดับ 1: จัดกลุ่มตาม Age + CountryName นับจำนวน (count)
  3. $group ระดับ 2: จัดกลุ่มตาม Age เพียงอย่างเดียว รวมประเทศเป็น array ของ key-value pairs
  4. $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) ที่ต้องการดูการกระจายตัวของค่าต่างๆ หลายมิติ