วิธีนับเอกสารด้วย MongoDB Aggregate Count

Withi Nab Xeksar Dwy Mongodb Aggregate Count



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

ตัวอย่างที่ 01

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

ทดสอบ> db.Test.find ({})







ตอนนี้ หากต้องการใช้ระยะ $count กับฟิลด์ใดๆ เราต้องใช้ฟังก์ชันรวมของ MongoDB ภายในคำสั่ง 'db' ฟังก์ชันการรวมประกอบด้วยคำสั่งเงื่อนไข ซึ่งมักใช้ตัวดำเนินการ $match ในฟิลด์เฉพาะ ตามด้วยฟิลด์ใหม่ที่แสดงจำนวนรวมที่ได้รับจากฟิลด์เงื่อนไขที่ระบุโดยใช้ตัวดำเนินการ $count



ในกรณีของเรา เราได้ใช้ตัวดำเนินการ $match เพื่อค้นหาบันทึกที่ตรงกันสำหรับค่า “60” ในฟิลด์คะแนน ในขณะที่ตัวดำเนินการ $count ถูกใช้เพื่อนับจำนวนบันทึกทั้งหมดที่ดึงมาและแสดงภายใต้ ฟิลด์ใหม่ชื่อ 'SameScore' ผลลัพธ์สำหรับการสืบค้นนี้แสดงฟิลด์ 'SameScore' ที่มีค่า '2' บ่งชี้ว่ามีเรกคอร์ดสองรายการที่มีค่า 'คะแนน' '60' คือ 2 ในคอลเลกชัน 'ทดสอบ'



db.Test.aggregate([ { $match: { 'คะแนน' : : 60 } }, { $นับ: 'เซมสกอร์' } ])

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





db.Test.aggregate([ { $match: { 'ชื่อ' : : 'จอห์น' } }, { $นับ: 'ชื่อเดียวกัน' } ])

ตัวอย่างที่ 02

มาอัปเดตแบบสอบถามข้างต้นและใช้เงื่อนไขอื่นเพื่อรับบันทึกที่แตกต่างกัน ในครั้งนี้ เราจะใช้การรวม $match ของฟิลด์คะแนนเพื่อรับจำนวนบันทึกทั้งหมด โดยที่ฟิลด์คะแนนมีค่าน้อยกว่า 30 การรวมการนับจะนับจำนวนบันทึกทั้งหมดและเพิ่มลงในใหม่ คอลัมน์ “เกรดD” ผลลัพธ์จะแสดงผลลัพธ์ “2” เป็นตัวเลขการนับสำหรับค่าที่ตรงกัน

db.Test.aggregate( [ { $match: { คะแนน: { $lt: 30 } } }, { $count: 'เกรดดี' } ] )

คุณยังสามารถใช้ $count aggregation ในขณะที่ใช้ตัวดำเนินการเชิงตรรกะเพื่อดำเนินการมากกว่า 1 เงื่อนไขในเรกคอร์ดฟิลด์ ดังนั้นจึงมีการใช้เงื่อนไขทั้งหมดสองข้อกับช่อง 'คะแนน' โดยใช้ตัวดำเนินการ $and: gte (มากกว่าหรือเท่ากับ) และ lte (น้อยกว่าและเท่ากับ) เงื่อนไขทั้งสองจะต้องเป็นจริงเพื่อให้ได้ผลลัพธ์และนับบันทึก จำนวนรวมแสดงว่ามีห้าเรกคอร์ดที่มีเกณฑ์ตรงกัน



db.Test.aggregate( [ { $match: { '$และ' : [ { 'คะแนน' : {$gte: 60 }}, { 'คะแนน' : {$lte: 80 }} ] }},

{ $นับ: 'เกรดบี' } ] )

ตัวอย่างที่ 03

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

สำหรับสิ่งนี้ คุณต้องใช้ $group aggregation ภายในคำสั่งฟังก์ชันการรวม ดังด้านล่าง ฟิลด์ _id ถูกใช้เพื่อระบุฟิลด์ 'ชื่อ' ที่การรวมการนับจะทำงาน นอกจากนี้ ฟิลด์ NameCount ที่ผู้ใช้กำหนดจะใช้การรวม $count เพื่อนับรายการซ้ำหลายรายการในฟิลด์ 'ชื่อ'

ผลลัพธ์สำหรับการสืบค้นนี้แสดงไว้ด้านล่าง โดยมีค่าจากฟิลด์ 'ชื่อ' และหมายเลขการนับภายในฟิลด์ NameCount ตามการทำซ้ำของค่า เช่น Cillian มี 4 รายการซ้ำกัน เป็นต้น

db.Test.aggregate([ { กลุ่ม $: { _id: '$ชื่อ' , NameCount: { $count: {} }, }, }, ])

ตัวอย่างที่ 04

นอกจากนี้เรายังสามารถใช้การรวมการนับในบันทึกฟิลด์ที่ซ้อนกันเพื่อนับค่าของฟิลด์ใดฟิลด์หนึ่งได้ เพื่ออธิบายรายละเอียดเกี่ยวกับเรื่องนี้ เราได้สร้างคอลเลกชั่นชื่อ 'Teacher' และเพิ่มฟิลด์แบบซ้อน 'sub' และฟิลด์ประเภทอาร์เรย์ 'shift' ไว้ภายในพร้อมกับฟิลด์อื่น ๆ ได้แก่ ชื่อและการชำระเงิน ฟังก์ชัน find() ได้แสดงบันทึกทั้งห้ารายการของคอลเลกชันนี้

ทดสอบ> db.Teacher.find ({})

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

db.Teacher.aggregate( [ { $match: { '$และ' : [ { 'ย่อยคณิต' : {$gte: 10 }}, { 'ย่อยคณิต' : {$lte: ยี่สิบ }} ] }}, { จำนวน $: 'เกรดเอ' } ] )

ตัวอย่างที่ 05

มาดูตัวอย่างสุดท้ายเพื่อสาธิตการใช้ฟังก์ชัน count() ในครั้งนี้แทนการใช้การรวมการนับ ดังนั้น ฟังก์ชัน count() จึงถูกนำไปใช้กับฟิลด์ประเภทอาร์เรย์ของคอลเลกชัน 'Teacher' เช่น 'shift' การใช้ดัชนีสำหรับฟิลด์อาร์เรย์โดยใช้ดัชนี 2 เราได้ระบุเกณฑ์การจับคู่เป็น 'กลางคืน' โดยจะส่งออก '2' เป็นจำนวนนับทั้งหมดสำหรับรายการ 'กลางคืน'

db.Teacher.count({ 'กะ.2' : : 'กลางคืน' })

ในทำนองเดียวกัน สามารถใช้ฟังก์ชัน count() กับฟิลด์ที่ซ้อนกันได้ เช่น ฟิลด์ย่อย 'phy' ของฟิลด์ 'sub' จากคอลเลกชัน 'Teacher' เราได้ระบุเกณฑ์การจับคู่โดยใช้ตัวดำเนินการ 'lte' ซึ่งระบุค่าน้อยกว่า 14 ในฟิลด์ย่อย 'phy' ผลลัพธ์ของคำสั่งนี้แสดง '2' เช่น 4 บันทึกที่มีค่าน้อยกว่า 14

db.Teacher.count( { 'sub.phy' : { $lte: 14 } })

บทสรุป

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