Mongodb อธิบายสำหรับกรอบการรวม


118

มีฟังก์ชันอธิบายสำหรับ Aggregation framework ใน MongoDB หรือไม่? ฉันไม่เห็นมันในเอกสาร

หากไม่มีวิธีอื่นในการตรวจสอบแบบสอบถามทำงานอย่างไรภายในกรอบการรวม?

ฉันรู้ว่าคุณเพิ่งทำ

db.collection.find().explain()

แต่ด้วยกรอบการรวมฉันได้รับข้อผิดพลาด

db.collection.aggregate(
    { $project : { "Tags._id" : 1 }},
    { $unwind : "$Tags" },
    { $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
    { 
        $group: 
        { 
            _id : { id: "$_id"},
            "count": { $sum:1 } 
        }
    },
    { $sort: {"count":-1}}
).explain()

คำตอบ:


172

เริ่มต้นด้วย MongoDB เวอร์ชัน 3.0 เพียงแค่เปลี่ยนลำดับจาก

collection.aggregate(...).explain()

ถึง

collection.explain().aggregate(...)

จะให้ผลลัพธ์ที่ต้องการ (เอกสารที่นี่ )

สำหรับเวอร์ชันเก่า> = 2.6 คุณจะต้องใช้explainตัวเลือกสำหรับการดำเนินการไปป์ไลน์การรวม

explain:true

db.collection.aggregate([
    { $project : { "Tags._id" : 1 }},
    { $unwind : "$Tags" },
    { $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
    { $group: { 
        _id : "$_id",
        count: { $sum:1 } 
    }},
    {$sort: {"count":-1}}
  ],
  {
    explain:true
  }
)

การพิจารณาที่สำคัญกับการรวมกรอบคือการที่ดัชนีเท่านั้นที่สามารถใช้ในการดึงข้อมูลเบื้องต้นสำหรับท่อ (เช่นการใช้งานของ $match, $sort, $geonearที่จุดเริ่มต้นของท่อที่) เช่นเดียวกับที่ตามมา $lookupและ$graphLookupขั้นตอน เมื่อได้รับข้อมูลที่ลึกซึ้งลงไปในท่อรวมสำหรับการประมวลผล (เช่นผ่านขั้นตอนเช่น$project, $unwindและ$group) การจัดการต่อไปจะอยู่ในหน่วยความจำ (อาจจะใช้ไฟล์ชั่วคราวถ้าallowDiskUseตัวเลือกเป็นชุด)

การเพิ่มประสิทธิภาพไปป์ไลน์

โดยทั่วไปคุณสามารถเพิ่มประสิทธิภาพไปป์ไลน์การรวมโดย:

  • การเริ่มต้นไปป์ไลน์โดยมี$matchขั้นตอนเพื่อ จำกัด การประมวลผลเอกสารที่เกี่ยวข้อง
  • การดูแลให้การเริ่มต้น$match/ $sortขั้นตอนการได้รับการสนับสนุนโดยดัชนีที่มีประสิทธิภาพ
  • การกรองข้อมูลในช่วงต้นใช้$match, และ$limit$skip
  • ลดขั้นตอนที่ไม่จำเป็นและการจัดการเอกสาร (อาจพิจารณาสคีมาของคุณใหม่หากจำเป็นต้องใช้ยิมนาสติกแบบรวมที่ซับซ้อน)
  • ใช้ประโยชน์จากตัวดำเนินการรวมรุ่นใหม่หากคุณอัพเกรดเซิร์ฟเวอร์ MongoDB ของคุณ ตัวอย่างเช่น MongoDB 3.4 ได้เพิ่มขั้นตอนการรวมและนิพจน์ใหม่ๆ มากมายรวมถึงการสนับสนุนการทำงานกับอาร์เรย์สตริงและแง่มุม

นอกจากนี้ยังมีAggregation Pipeline Optimizations จำนวนหนึ่งที่เกิดขึ้นโดยอัตโนมัติขึ้นอยู่กับเวอร์ชันเซิร์ฟเวอร์ MongoDB ของคุณ ตัวอย่างเช่นขั้นตอนที่อยู่ติดกันอาจรวมกันและ / หรือจัดลำดับใหม่เพื่อปรับปรุงการดำเนินการโดยไม่ส่งผลต่อผลลัพธ์ของผลลัพธ์

ข้อ จำกัด

สำหรับ MongoDB 3.4 explainอ็อพชันAggregation Framework จะให้ข้อมูลเกี่ยวกับวิธีการประมวลผลไปป์ไลน์ แต่ไม่สนับสนุนรายละเอียดระดับเดียวกับexecutionStatsโหมดสำหรับfind()คิวรี หากคุณกำลังมุ่งเน้นไปที่การเพิ่มประสิทธิภาพการดำเนินการแบบสอบถามครั้งแรกคุณอาจจะพบว่ามันเป็นประโยชน์ต่อการตรวจสอบเทียบเท่าfind().explain()แบบสอบถามexecutionStatsหรือallPlansExecutionฟุ่มเฟื่อย

มีคำขอคุณสมบัติที่เกี่ยวข้องสองสามรายการเพื่อรับชม / โหวตในตัวติดตามปัญหา MongoDB เกี่ยวกับสถิติการดำเนินการโดยละเอียดเพิ่มเติมเพื่อช่วยเพิ่มประสิทธิภาพ / โปรไฟล์ไปป์ไลน์การรวม:


ขอบคุณสำหรับข้อมูลที่จะดูว่าฉันสามารถทำการเปลี่ยนแปลงใด ๆ ได้หรือไม่
SCB

$sortวัตถุไม่ควรอยู่ในอาร์เรย์ไปป์ไลน์ใช่หรือไม่
JohnnyHK

@JohnnyHK: ครับ บางคน "แก้ไข" คำตอบไม่ถูกต้อง :)
Stennie

แต่นี่ไม่ได้ให้ "การดำเนินการ"
Kanagavelu Sugumar

1
@KanagaveluSugumar ฉันได้อัปเดตคำตอบพร้อมคำชี้แจงเกี่ยวกับexplainข้อ จำกัดAggregation Framework รวมถึงคำขอคุณสมบัติที่เกี่ยวข้องสำหรับสถิติการดำเนินการเพิ่มเติม
Stennie

29

เริ่มต้นด้วยรุ่น2.6.x MongoDB ให้ผู้ใช้สามารถทำอธิบายกับกรอบการรวม

สิ่งที่คุณต้องทำคือเพิ่มคำอธิบาย: จริง

db.records.aggregate(
  [ ...your pipeline...],
  { explain: true }
)

ขอขอบคุณที่ราฟาฉันรู้ว่ามันเป็นไปได้ที่จะทำแม้ใน 2.4 runCommand()แต่เพียงผ่าน แต่ตอนนี้คุณสามารถใช้การรวมได้เช่นกัน


5
จริงๆแล้วคุณสามารถอธิบายการรวมได้db.collection.runCommand('aggregate', {pipeline: [PIPELINE], explain: true})ตั้งแต่ MongoDB 2.2
Rafa

1
คุณพูดถูกใน 2.2 และ 2.4 คุณสามารถอธิบายการรวมผ่าน runCommand เท่านั้น ขอบคุณสำหรับการโหวตเพิ่ม
Rafa

3
แม้ว่าตัวเลือกจะมีอยู่ในทางเทคนิคผ่าน runCommand ก่อน 2.6 แต่ก็ไม่รับประกันว่าจะให้ผลลัพธ์ที่ถูกต้องและไม่ควรสนับสนุน คุณควรใช้สิ่งนี้ใน 2.5.3 หรือใหม่กว่าเท่านั้น (และคาดว่าอาจยังมีข้อบกพร่องบางอย่างแฝงตัวอยู่ก่อนที่จะมีการผลิต 2.6 รุ่น)
Stennie

20

กรอบการรวม

เฟรมเวิร์กการรวมเป็นชุดของเครื่องมือวิเคราะห์ภายในMongoDBที่ช่วยให้เราสามารถเรียกใช้รายงานหรือการวิเคราะห์ประเภทต่างๆบนเอกสารในคอลเลกชันหนึ่งชุดขึ้นไป ขึ้นอยู่กับความคิดของท่อ เรารับข้อมูลจากMongoDBคอลเลกชันและส่งผ่านเอกสารจากคอลเล็กชันนั้นผ่านหนึ่งขั้นตอนขึ้นไปซึ่งแต่ละขั้นตอนจะดำเนินการที่แตกต่างกันกับอินพุตนั้น แต่ละขั้นตอนจะใช้อินพุตเป็นขั้นตอนใดก็ได้ก่อนที่จะสร้างเป็นเอาต์พุต และอินพุตและเอาต์พุตสำหรับทุกขั้นตอนเป็นสตรีมของเอกสาร แต่ละขั้นตอนมีงานเฉพาะที่ทำ คาดว่าจะมีรูปแบบเอกสารที่เฉพาะเจาะจงและสร้างผลลัพธ์ที่เฉพาะเจาะจงซึ่งตัวเองเป็นสตรีมของเอกสาร ในตอนท้ายของไปป์ไลน์เราสามารถเข้าถึงผลลัพธ์ได้

ขั้นตอนกรอบการรวม

แต่ละขั้นตอนคือหน่วยประมวลผลข้อมูล แต่ละขั้นตอนจะใช้เป็นอินพุตสตรีมของเอกสารทีละขั้นตอนประมวลผลเอกสารทีละรายการและสร้างสตรีมเอาต์พุตของเอกสาร อีกครั้งหนึ่งครั้ง แต่ละสเตจจะมีชุดลูกบิดหรือตัวปรับตั้งที่เราสามารถควบคุมเพื่อกำหนดพารามิเตอร์ของสเตจเพื่อทำงานอะไรก็ได้ที่เราสนใจจะทำ ดังนั้นสเตจจึงเป็นงานทั่วไปซึ่งเป็นงานวัตถุประสงค์ทั่วไปบางประเภทและกำหนดพารามิเตอร์ของสเตจสำหรับชุดเอกสารเฉพาะที่เรากำลังทำงานด้วย และสิ่งที่เราต้องการให้ขั้นตอนนั้นทำกับเอกสารเหล่านั้น โดยทั่วไปแล้ว tunables เหล่านี้จะอยู่ในรูปแบบของตัวดำเนินการที่เราสามารถจัดหาได้ซึ่งจะแก้ไขฟิลด์ดำเนินการทางคณิตศาสตร์จัดรูปแบบเอกสารหรือทำงานสะสมบางอย่างรวมทั้งความถูกต้องของสิ่งอื่น ๆ บ่อยครั้งเป็นกรณีที่เรา

เวทีประเภทเดียวกันหลาย ๆ ครั้งภายในท่อเดียว

เช่นเราอาจต้องการกรองข้อมูลเบื้องต้นเพื่อที่เราจะได้ไม่ต้องส่งคอลเลกชันทั้งหมดไปยังท่อของเรา แต่หลังจากนั้นหลังจากการประมวลผลเพิ่มเติมบางอย่างต้องการกรองอีกครั้งโดยใช้ชุดเกณฑ์อื่น ดังนั้นในการสรุปไปป์ไลน์จึงทำงานร่วมกับMongoDBคอลเลกชัน ประกอบด้วยขั้นตอนซึ่งแต่ละขั้นตอนจะทำหน้าที่ประมวลผลข้อมูลที่แตกต่างกันในการป้อนข้อมูลและสร้างเอกสารเป็นเอาต์พุตเพื่อส่งต่อไปยังขั้นตอนต่อไป และในที่สุดเมื่อสิ้นสุดการส่งออกไปป์ไลน์ก็ถูกสร้างขึ้นซึ่งเราสามารถทำอะไรบางอย่างภายในแอปพลิเคชันของเราได้ ในหลาย ๆ กรณีจำเป็นที่จะต้องรวมเวทีประเภทเดียวกันหลาย ๆ ครั้งไว้ในแต่ละขั้นตอน


ขอบคุณมันเป็นประโยชน์ที่จะได้รับความเข้าใจที่ดีขึ้น
อรุณประทัดสิงห์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.