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- ใช้เพื่อคลายเอกสารที่ใช้อาร์เรย์ เมื่อใช้อาร์เรย์ข้อมูลจะถูกรวมไว้ล่วงหน้าและการดำเนินการนี้จะถูกยกเลิกเพื่อให้มีเอกสารแต่ละชุดอีกครั้ง ดังนั้นในขั้นตอนนี้เราจะเพิ่มจำนวนเอกสารสำหรับขั้นตอนต่อไป