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

ใช้ Aggregation Pipeline ดึงข้อมูลใน MongoDB

MongoDB Aggregation Pipeline เป็น framework ประมวลผลข้อมูลแบบขั้นตอน (stages) แต่ละ stage แปลง documents และส่งต่อไปยัง stage ถัดไป เหมาะสำหรับ analytics, transformation, joining

สร้างคอลเลกชันและข้อมูลตัวอย่าง

> db.demo218.insertOne({"Name":"Chris","Branch":"CS",Marks:[65,78,36,90]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3e5f4903d395bdc2134712") }
> db.demo218.insertOne({"Name":"David","Branch":"ME",Marks:[56,45,42,51]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3e5f6203d395bdc2134713") }
> db.demo218.insertOne({"Name":"Chris","Branch":"CS",Marks:[78,65,89]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3e5f6c03d395bdc2134714") }

แสดงข้อมูลทั้งหมด

> db.demo218.find();

ผลลัพธ์: 3 เอกสาร Chris 2 records (CS), David 1 record (ME)

Query Aggregation Pipeline: หา CS Students ที่ได้ Marks > 88

> db.demo218.aggregate([
  { "$unwind": "$Marks" },
  { "$match": {
    "Branch": "CS",
    "Marks": { "$gt": 88 }
  }},
  { "$group": {
    "_id": "$_id",
    "Branch": { "$first": "$Branch" },
    "Marks": { "$first": "$Marks" }
  }}
])

คำอธิบาย Stages:

  1. $unwind: "$Marks": แยก array Marks → แต่ละคะแนนเป็น document แยก (Chris doc 1 → 4 docs, Chris doc 2 → 3 docs, David → 4 docs)
  2. $match: กรองเฉพาะ Branch="CS" และ Marks > 88
  3. $group: รวมกลับตาม _id เดิม ใช้ $first เก็บ Branch และ Marks ที่เจอแรก (ซึ่งเป็นคะแนน > 88 เพราะ sort ไม่ได้ระบุ)

ผลลัพธ์

{ "_id" : ObjectId("5e3e5f6c03d395bdc2134714"), "Branch" : "CS", "Marks" : 89 }
{ "_id" : ObjectId("5e3e5f4903d395bdc2134712"), "Branch" : "CS", "Marks" : 90 }

ได้ 2 records: Chris (doc 2) Marks 89, Chris (doc 1) Marks 90

Common Pipeline Stages

Pipeline Optimization Tips

  • วาง $match ให้早ที่สุด (ใช้ index ได้)
  • $project ลด field size ก่อน $unwind/$group
  • ใช้ $sort ก่อน $group หากต้องการ $first/$last ที่เฉพาะเจาะจง
  • Allow disk use: {allowDiskUse: true} สำหรับ large sorts/groups

สรุป: Aggregation Pipeline = powerful ETL tool ใน MongoDB ใช้ stages ต่อเนื่องเพื่อ transform, filter, join, aggregate ข้อมูล

Stage 목적ตัวอย่าง
$matchFilter documents{$match: {status: "active"}}
$projectReshape fields{$project: {name: 1, _id: 0}}
$groupGroup & aggregate{$group: {_id: "$dept", avg: {$avg: "$salary"}}}
$sortSort documents{$sort: {age: -1}}
$limitLimit results{$limit: 10}
$skipSkip documents{$skip: 20}
$unwindDeconstruct array{$unwind: "$tags"}
$lookupJoin collections{$lookup: {from: "orders", localField: "_id", foreignField: "userId", as: "orders"}}
$addFieldsAdd computed fields{$addFields: {fullName: {$concat: ["$first", " ", "$last"]}}}
$facetMultiple pipelines{$facet: {cats: [...], dogs: [...]}}