MongoDB - การรวม

การดำเนินการรวมประมวลผลบันทึกข้อมูลและส่งคืนผลลัพธ์ที่คำนวณ ค่ากลุ่มการดำเนินการรวมจากเอกสารหลายชุดเข้าด้วยกันและสามารถดำเนินการต่างๆกับข้อมูลที่จัดกลุ่มเพื่อส่งคืนผลลัพธ์เดียว ใน SQL count (*) และ group by จะเทียบเท่ากับ MongoDB aggregation

วิธีการรวม ()

สำหรับการรวมใน MongoDB คุณควรใช้ aggregate() วิธี.

ไวยากรณ์

ไวยากรณ์พื้นฐานของ aggregate() วิธีการมีดังนี้ -

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

ตัวอย่าง

ในคอลเล็กชันคุณมีข้อมูลต่อไปนี้ -

{
   _id: ObjectId(7df78ad8902c)
   title: 'MongoDB Overview', 
   description: 'MongoDB is no sql database',
   by_user: 'tutorials point',
   url: 'http://www.tutorialspoint.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 100
},
{
   _id: ObjectId(7df78ad8902d)
   title: 'NoSQL Overview', 
   description: 'No sql database is very fast',
   by_user: 'tutorials point',
   url: 'http://www.tutorialspoint.com',
   tags: ['mongodb', 'database', 'NoSQL'],
   likes: 10
},
{
   _id: ObjectId(7df78ad8902e)
   title: 'Neo4j Overview', 
   description: 'Neo4j is no sql database',
   by_user: 'Neo4j',
   url: 'http://www.neo4j.com',
   tags: ['neo4j', 'database', 'NoSQL'],
   likes: 750
},

จากคอลเล็กชันด้านบนหากคุณต้องการแสดงรายการที่ระบุจำนวนบทช่วยสอนที่เขียนโดยผู้ใช้แต่ละคนคุณจะใช้สิ่งต่อไปนี้ aggregate() วิธีการ -

> db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])
{ "_id" : "tutorials point", "num_tutorial" : 2 }
{ "_id" : "Neo4j", "num_tutorial" : 1 }
>

แบบสอบถามเทียบเท่า SQL สำหรับกรณีการใช้งานข้างต้นจะเป็น select by_user, count(*) from mycol group by by_user.

ในตัวอย่างข้างต้นเราได้จัดกลุ่มเอกสารตามฟิลด์ by_userและแต่ละครั้งที่เกิดขึ้นโดยผู้ใช้ก่อนหน้าค่าของผลรวมจะเพิ่มขึ้น ต่อไปนี้เป็นรายการนิพจน์การรวมที่พร้อมใช้งาน

นิพจน์ คำอธิบาย ตัวอย่าง
$ sum รวมค่าที่กำหนดจากเอกสารทั้งหมดในคอลเล็กชัน db.mycol.aggregate ([{$ group: {_id: "$ by_user", num_tutorial: {$ sum: "$ likes"}}}])
$ เฉลี่ย คำนวณค่าเฉลี่ยของค่าที่กำหนดทั้งหมดจากเอกสารทั้งหมดในคอลเล็กชัน db.mycol.aggregate ([{$ group: {_id: "$ by_user", num_tutorial: {$ avg: "$ likes"}}}])
$ นาที รับค่าต่ำสุดของค่าที่เกี่ยวข้องจากเอกสารทั้งหมดในคอลเล็กชัน db.mycol.aggregate ([{$ group: {_id: "$ by_user", num_tutorial: {$ min: "$ likes"}}}])
สูงสุด $ รับค่าสูงสุดที่สอดคล้องกันจากเอกสารทั้งหมดในคอลเล็กชัน db.mycol.aggregate ([{$ group: {_id: "$ by_user", num_tutorial: {$ max: "$ likes"}}}])
$ ดัน แทรกค่าให้กับอาร์เรย์ในเอกสารผลลัพธ์ db.mycol.aggregate ([{$ group: {_id: "$ by_user", url: {$ push: "$ url"}}}])
$ addToSet แทรกค่าให้กับอาร์เรย์ในเอกสารผลลัพธ์ แต่ไม่สร้างรายการที่ซ้ำกัน db.mycol.aggregate ([{$ group: {_id: "$ by_user", url: {$ addToSet: "$ url"}}}])
$ แรก รับเอกสารแรกจากเอกสารต้นทางตามการจัดกลุ่ม โดยทั่วไปแล้วสิ่งนี้จะเข้ากันได้กับเวที“ $ sort” ที่ใช้ก่อนหน้านี้เท่านั้น db.mycol.aggregate ([{$ group: {_id: "$ by_user", first_url: {$ first: "$ url"}}}])
$ last รับเอกสารล่าสุดจากเอกสารต้นทางตามการจัดกลุ่ม โดยทั่วไปแล้วสิ่งนี้จะเข้ากันได้กับเวที“ $ sort” ที่ใช้ก่อนหน้านี้เท่านั้น db.mycol.aggregate ([{$ group: {_id: "$ by_user", last_url: {$ last: "$ url"}}}])

แนวคิดท่อ

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

ต่อไปนี้เป็นขั้นตอนที่เป็นไปได้ในกรอบการรวม -

  • $project - ใช้เพื่อเลือกฟิลด์เฉพาะบางฟิลด์จากคอลเลกชัน

  • $match - นี่คือการดำเนินการกรองดังนั้นจึงสามารถลดจำนวนเอกสารที่กำหนดให้เป็นข้อมูลป้อนเข้าในขั้นตอนต่อไป

  • $group - นี่เป็นการรวมจริงตามที่กล่าวไว้ข้างต้น

  • $sort - จัดเรียงเอกสาร

  • $skip - ด้วยวิธีนี้คุณสามารถข้ามไปข้างหน้าในรายการเอกสารสำหรับจำนวนเอกสารที่กำหนดได้

  • $limit - สิ่งนี้จะ จำกัด จำนวนเอกสารที่จะดูตามจำนวนที่กำหนดโดยเริ่มจากตำแหน่งปัจจุบัน

  • $unwind- ใช้เพื่อคลายเอกสารที่ใช้อาร์เรย์ เมื่อใช้อาร์เรย์ข้อมูลจะถูกรวมไว้ล่วงหน้าและการดำเนินการนี้จะถูกยกเลิกเพื่อให้มีเอกสารแต่ละชุดอีกครั้ง ดังนั้นในขั้นตอนนี้เราจะเพิ่มจำนวนเอกสารสำหรับขั้นตอนต่อไป