การรวมกลุ่ม MongoDB

Kar Rwm Klum Mongodb



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

การรวมกลุ่มทำงานใน MongoDB อย่างไร

ควรใช้ตัวดำเนินการ $group เพื่อจัดกลุ่มเอกสารอินพุตตามนิพจน์ _id ที่ระบุ จากนั้นควรส่งคืนเอกสารเดียวพร้อมค่ารวมสำหรับแต่ละกลุ่มที่แยกจากกัน เพื่อเริ่มต้นใช้งาน เราได้สร้างคอลเลกชัน “หนังสือ” ใน MongoDB หลังจากสร้างคอลเลกชัน 'หนังสือ' เราได้แทรกเอกสารที่เกี่ยวข้องกับฟิลด์ต่างๆ เอกสารถูกแทรกในคอลเล็กชันโดยใช้เมธอด insertMany() เนื่องจากข้อความค้นหาที่จะดำเนินการแสดงอยู่ด้านล่าง

>db.Books.insertMany([

{
_id:1,
ชื่อเรื่อง: 'แอนนา คาเรนินา'
ราคา: 290,
ปี พ.ศ. 2422
order_status: 'ในสต็อก',
ผู้เขียน: {
'ชื่อ':'ลีโอ ตอลสตอย'
}
},
{
_id:2,
ชื่อเรื่อง: 'การฆ่าม็อกกิ้งเบิร์ด'
ราคา: 500,
ปี: 1960,
order_status: 'สินค้าหมด',
ผู้เขียน: {
'ชื่อ':'ฮาร์เปอร์ ลี'
}
},
{
_id:3,
ชื่อเรื่อง: 'มนุษย์ล่องหน',
ราคา: 312,
ปี: 2496,
order_status: 'ในสต็อก',
ผู้เขียน: {
'ชื่อ':'ราล์ฟ เอลลิสัน'
}
},
{
_id:4,
ชื่อเรื่อง: 'ที่รัก',
ราคา: 370,
ปี: 1873,
order_status: 'สินค้าหมด',
ผู้เขียน: {
'ชื่อ':'โทนี่ มอร์ริสัน'
}
},
{
_id:5,
ชื่อเรื่อง: 'สิ่งต่าง ๆ แตกสลาย',
ราคา: 200,
ปี: 1958,
order_status: 'ในสต็อก',
ผู้เขียน: {
'name':'ชีนัว อาเชเบ'
}
},
{
_id:6,
ชื่อเรื่อง: 'สีม่วง',
ราคา: 510,
ปี: 1982,
order_status: 'สินค้าหมด',
ผู้เขียน: {
'ชื่อ':'อลิซ วอล์กเกอร์'
}
}
])

เอกสารถูกจัดเก็บไว้ในคอลเลกชัน 'หนังสือ' สำเร็จโดยไม่พบข้อผิดพลาดใด ๆ เนื่องจากผลลัพธ์ได้รับการยอมรับว่าเป็น 'จริง' ตอนนี้ เราจะใช้เอกสารเหล่านี้ของคอลเลกชัน 'หนังสือ' เพื่อดำเนินการรวม '$group'









ตัวอย่าง # 1: การใช้ $group Aggregation



การใช้งานอย่างง่ายของการรวมกลุ่ม $group แสดงไว้ที่นี่ ข้อความค้นหารวมจะป้อนโอเปอเรเตอร์ '$group' ก่อน จากนั้นโอเปอเรเตอร์ '$group' จะใช้นิพจน์เพื่อสร้างเอกสารที่จัดกลุ่ม





>db.Books.aggregate([

{ $group:{ _id:'$author.name'} }

])

ข้อความค้นหาด้านบนของตัวดำเนินการ $group ถูกระบุด้วยฟิลด์ “_id” เพื่อคำนวณค่ารวมสำหรับเอกสารอินพุตทั้งหมด จากนั้น ฟิลด์ '_id' จะถูกจัดสรรด้วย '$author.name' ซึ่งจะจัดกลุ่มที่แตกต่างกันในฟิลด์ '_id' ค่าที่แยกจากกันของ $author.name จะถูกส่งคืน เนื่องจากเราไม่ได้คำนวณค่าสะสมใดๆ การดำเนินการของแบบสอบถามรวม $group มีผลลัพธ์ดังต่อไปนี้ ช่อง _id มีค่าเป็นชื่อผู้แต่ง



ตัวอย่าง # 2: การใช้ $group Aggregation กับ $push Accumulator

ตัวอย่างของการรวม $group ใช้ตัวสะสมใด ๆ ที่กล่าวถึงข้างต้น แต่เราสามารถใช้ตัวสะสมในการรวม $group ได้ ตัวดำเนินการสะสมคือตัวดำเนินการที่ใช้ในฟิลด์เอกสารอินพุตนอกเหนือจากที่ 'จัดกลุ่ม' ภายใต้ '_id' สมมติว่าเราต้องการพุชฟิลด์ของนิพจน์ลงในอาร์เรย์ จากนั้นตัวสะสม '$push' จะถูกเรียกใช้ในตัวดำเนินการ '$group' ตัวอย่างจะช่วยให้คุณเข้าใจตัวสะสม “$push” ของ “$group” ได้ชัดเจนยิ่งขึ้น

>db.Books.aggregate(

[

{ $group : { _id : '$_id', ปี: { $push: '$year' } } }

]

).สวย();

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

ตัวอย่าง # 3: การใช้ $group Aggregation กับตัวสะสม “$min”

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

>db.Books.aggregate([

{
$group:{
_id:{
ชื่อเรื่อง: '$title',
order_status: '$order_status'
},
ราคาต่ำสุด:{$ขั้นต่ำ: '$price'}
}
}
])

ข้อความค้นหามีนิพจน์การรวม '$group' ซึ่งเราได้จัดกลุ่มเอกสารสำหรับฟิลด์ 'title' และ 'order_status' จากนั้น เราจัดเตรียมตัวสะสม $min ซึ่งจัดกลุ่มเอกสารโดยรับค่าราคาขั้นต่ำจากฟิลด์ที่ไม่ได้จัดกลุ่ม เมื่อเรารันคิวรีของ $min accumulator ด้านล่างนี้ จะส่งคืนเอกสารที่จัดกลุ่มตามชื่อเรื่องและ order_status ตามลำดับ ราคาต่ำสุดจะปรากฏก่อน และราคาสูงสุดของเอกสารจะอยู่หลังสุด

ตัวอย่าง # 4: ใช้ $group Aggregation กับ $sum Accumulator

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

>db.Books.aggregate([

{ $match:{ order_status:'In-Stock'}},

{ $group:{ _id:'$author.name', totalBooks: { $sum:1 } }

}])

ข้อความค้นหาการรวมข้างต้นเริ่มต้นด้วยตัวดำเนินการ $match ซึ่งจะจับคู่ 'order_status' ทั้งหมดที่มีสถานะเป็น 'In-Stock' และส่งผ่านไปยัง $group เป็นอินพุต จากนั้น ตัวดำเนินการ $group จะมีนิพจน์ $sum accumulator ซึ่งจะแสดงผลรวมของหนังสือทั้งหมดในสต็อก โปรดทราบว่า “$sum:1” เพิ่ม 1 ในแต่ละเอกสารที่อยู่ในกลุ่มเดียวกัน ผลลัพธ์ที่นี่แสดงเอกสารที่จัดกลุ่มไว้เพียงสองชุดที่มี 'order_status' เชื่อมโยงกับ 'In-Stock'

ตัวอย่าง # 5: ใช้ $group Aggregation กับ $sort Aggregation

ตัวดำเนินการ $group ในที่นี้ใช้กับตัวดำเนินการ “$sort” ซึ่งใช้ในการจัดเรียงเอกสารที่จัดกลุ่ม แบบสอบถามต่อไปนี้มีสามขั้นตอนในการดำเนินการเรียงลำดับ ขั้นแรกคือขั้น $match จากนั้นเป็นขั้น $group และขั้นสุดท้ายคือขั้น $sort ซึ่งจะจัดเรียงเอกสารที่จัดกลุ่มไว้

>db.Books.aggregate([

{ $match:{ order_status:'out-of-stock'}},

{ $group:{ _id:{ authorName :'$author.name'}, totalBooks: { $sum:1} } },

{ $sort:{ ชื่อผู้แต่ง:1}}

])

ที่นี่ เราได้ดึงเอกสารที่ตรงกันซึ่ง “order_status” หมดสต็อกแล้ว จากนั้น เอกสารที่ตรงกันจะถูกป้อนในขั้นตอน $group ซึ่งจัดกลุ่มเอกสารด้วยฟิลด์ 'ชื่อผู้แต่ง' และ 'totalBooks' นิพจน์กลุ่ม $ เชื่อมโยงกับตัวสะสม $sum กับจำนวนหนังสือที่ 'หมดสต็อก' ทั้งหมด เอกสารที่จัดกลุ่มจะถูกจัดเรียงด้วยนิพจน์ $sort ในลำดับจากน้อยไปหามากเป็น '1' ในที่นี้หมายถึงลำดับจากน้อยไปหามาก เอกสารกลุ่มที่เรียงลำดับตามลำดับที่ระบุจะได้รับในเอาต์พุตต่อไปนี้

ตัวอย่าง # 6: ใช้ $group Aggregation สำหรับค่าที่แตกต่าง

ขั้นตอนการรวมยังจัดกลุ่มเอกสารตามรายการโดยใช้ตัวดำเนินการ $group เพื่อแยกค่ารายการที่แตกต่างกัน ให้เรามีนิพจน์แบบสอบถามของคำสั่งนี้ใน MongoDB

>db.Books.aggregate( [ { $group : { _id : '$title' } } ] ).pretty();

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

บทสรุป

คู่มือนี้มีจุดประสงค์เพื่อทำความเข้าใจแนวคิดของตัวดำเนินการรวม $group สำหรับการจัดกลุ่มเอกสารในฐานข้อมูล MongoDB วิธีการรวม MongoDB ช่วยปรับปรุงปรากฏการณ์การจัดกลุ่ม โครงสร้างไวยากรณ์ของตัวดำเนินการ $group แสดงด้วยโปรแกรมตัวอย่าง นอกจากตัวอย่างพื้นฐานของตัวดำเนินการ $group แล้ว เรายังใช้ตัวดำเนินการนี้กับตัวสะสมบางอย่าง เช่น $push, $min, $sum และตัวดำเนินการ เช่น $match และ $sort