MongoDB นิพจน์ทั่วไป (Regex) พร้อมตัวอย่าง
นิพจน์ทั่วไปใช้สำหรับการจับคู่รูปแบบ ซึ่งโดยพื้นฐานแล้วใช้สำหรับการค้นหาสตริงภายในเอกสาร
บางครั้งเมื่อดึงเอกสารในคอลเลกชัน คุณอาจไม่ทราบแน่ชัดว่าต้องค้นหาค่าฟิลด์ใด ดังนั้น เราสามารถใช้นิพจน์ทั่วไปเพื่อช่วยในการดึงข้อมูลตามรูปแบบที่ตรงกับค่าการค้นหา
การใช้ตัวดำเนินการ $regex สำหรับการจับคู่รูปแบบ
เทศกาล ตัวดำเนินการ regex ใน MongoDB ใช้เพื่อค้นหาสตริงที่เจาะจงในคอลเล็กชัน ตัวอย่างต่อไปนี้จะแสดงวิธีดำเนินการนี้
สมมติว่าเรามีคอลเลกชัน Employee เดียวกัน ซึ่งมีชื่อฟิลด์เป็น “Employeeid” และ “EmployeeName” นอกจากนี้ สมมติว่าเรามีเอกสารต่อไปนี้ในคอลเลกชันของเรา
รหัสพนักงาน | ชื่อพนักงาน |
---|---|
22 | นิวมาร์ติน |
2 | โมฮัน |
3 | โจ |
4 | โมฮันอาร์ |
100 | Guru99 |
6 | กูรัง |
ในโค้ดด้านล่างนี้ เราใช้ตัวดำเนินการ regex เพื่อระบุเกณฑ์การค้นหา
db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)
คำอธิบายรหัส:
- เราต้องการค้นหาชื่อพนักงานทั้งหมดที่มีอักขระ 'Gu' อยู่ในนั้น ดังนั้น เราจึงระบุตัวดำเนินการ $regex เพื่อกำหนดเกณฑ์การค้นหาของ 'Gu'
- printjson ถูกใช้เพื่อพิมพ์เอกสารแต่ละฉบับที่แบบสอบถามส่งคืนด้วยวิธีที่ดีกว่า
หากดำเนินการคำสั่งสำเร็จ จะแสดงผลลัพธ์ต่อไปนี้:
Output:
ผลลัพธ์แสดงให้เห็นอย่างชัดเจนว่าเอกสารเหล่านั้นที่ชื่อพนักงานมีอักขระ 'Gu' จะถูกส่งกลับ
หากสมมติว่าคอลเล็กชันของคุณมีเอกสารต่อไปนี้พร้อมเอกสารเพิ่มเติมที่มีชื่อพนักงานว่า “Guru999” หากคุณป้อนเกณฑ์การค้นหาเป็น “Guru99” ระบบจะแสดงเอกสารที่มี “Guru999” ด้วย แต่สมมติว่าเราไม่ต้องการสิ่งนี้และต้องการส่งคืนเอกสารที่มี “Guru99” เท่านั้น จากนั้นเราสามารถดำเนินการนี้โดยใช้การจับคู่รูปแบบที่แน่นอน หากต้องการจับคู่รูปแบบที่แน่นอน เราจะใช้เครื่องหมาย ^ และ $ เราจะเพิ่มเครื่องหมาย ^ ไว้ที่จุดเริ่มต้นของสตริงและ $ ไว้ที่จุดสิ้นสุดของสตริง
รหัสพนักงาน | ชื่อพนักงาน |
---|---|
22 | นิวมาร์ติน |
2 | โมฮัน |
3 | โจ |
4 | โมฮันอาร์ |
100 | Guru99 |
6 | กูรัง |
8 | Guru999 |
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงวิธีดำเนินการนี้
db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)
คำอธิบายรหัส:
- ในเกณฑ์การค้นหา เราใช้อักขระ ^ และ $ ^ ใช้เพื่อให้แน่ใจว่าสตริงเริ่มต้นด้วยอักขระบางตัว และใช้ $ เพื่อให้แน่ใจว่าสตริงลงท้ายด้วยอักขระบางตัว ดังนั้นเมื่อโค้ดทำงาน มันจะดึงเฉพาะสตริงชื่อ "Guru99"
- printjson ถูกใช้เพื่อพิมพ์เอกสารแต่ละฉบับที่แบบสอบถามส่งคืนด้วยวิธีที่ดีกว่า
หากดำเนินการคำสั่งสำเร็จ จะแสดงผลลัพธ์ต่อไปนี้:
Output:
ในเอาต์พุตจะเห็นได้ชัดเจนว่าดึงสตริง “Guru99” ออกมาอย่างชัดเจน
การจับคู่รูปแบบด้วยตัวเลือก $
เมื่อใช้ตัวดำเนินการ regex คุณยังสามารถให้ตัวเลือกเพิ่มเติมได้โดยใช้ $ตัวเลือก คำสำคัญ. ตัวอย่างเช่น สมมติว่าคุณต้องการค้นหาเอกสารทั้งหมดที่มี 'Gu' อยู่ในชื่อพนักงาน โดยไม่คำนึงว่าจะคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่หรือไม่ก็ตาม หากต้องการผลลัพธ์ดังกล่าว เราจำเป็นต้องใช้ $ตัวเลือก ด้วยพารามิเตอร์ที่ไม่คำนึงถึงขนาดตัวพิมพ์
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงวิธีดำเนินการนี้
สมมติว่าเรามีคอลเลกชันพนักงานเดียวกันซึ่งมีชื่อฟิลด์เป็น "Employeeid" และ "EmployeeName"
ลองสมมติว่าเรามีเอกสารต่อไปนี้ในคอลเลกชั่นของเรา
รหัสพนักงาน | ชื่อพนักงาน |
---|---|
22 | นิวมาร์ติน |
2 | โมฮัน |
3 | โจ |
4 | โมฮันอาร์ |
100 | Guru99 |
6 | กูรัง |
7 | กูรู99 |
ตอนนี้ถ้าเราเรียกใช้แบบสอบถามเดียวกันกับในหัวข้อที่แล้ว เราจะไม่เห็นเอกสารที่มี "GURU99" ในผลลัพธ์ เพื่อให้แน่ใจว่าสิ่งนี้มาในชุดผลลัพธ์ เราจำเป็นต้องเพิ่มพารามิเตอร์ $options “I”
db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)
คำอธิบายรหัส:
- $options ที่มีพารามิเตอร์ 'I' (ซึ่งหมายถึงไม่คำนึงถึงขนาดตัวพิมพ์) ระบุว่าเราต้องการดำเนินการค้นหาไม่ว่าเราจะพบตัวอักษร 'Gu' เป็นตัวพิมพ์เล็กหรือใหญ่ก็ตาม
หากดำเนินการคำสั่งสำเร็จ จะแสดงผลลัพธ์ต่อไปนี้:
Output:
- ผลลัพธ์แสดงให้เห็นอย่างชัดเจนว่าแม้ว่าเอกสารหนึ่งจะมีอักษร 'Gu' ตัวใหญ่ แต่เอกสารนั้นก็ยังคงแสดงในชุดผลลัพธ์
การจับคู่รูปแบบโดยไม่ใช้ตัวดำเนินการ regex
นอกจากนี้ คุณยังสามารถทำการจับคู่รูปแบบได้โดยไม่ต้องใช้ตัวดำเนินการ regex ตัวอย่างต่อไปนี้จะแสดงวิธีการดำเนินการนี้
db.Employee.find({EmployeeName: /Gu/'}).forEach(printjson)
คำอธิบายรหัส:
- โดยทั่วไปตัวเลือก “//” หมายถึงการระบุเกณฑ์การค้นหาของคุณภายในตัวคั่นเหล่านี้ ดังนั้นเราจึงกำหนดให้ /Gu/ ค้นหาเอกสารที่มี 'Gu' อยู่ใน EmployeeName อีกครั้ง
หากดำเนินการคำสั่งสำเร็จ จะแสดงผลลัพธ์ต่อไปนี้:
Output:
ผลลัพธ์แสดงให้เห็นอย่างชัดเจนว่าเอกสารเหล่านั้นที่ชื่อพนักงานมีอักขระ 'Gu' จะถูกส่งกลับ
กำลังดึงเอกสาร 'n' สุดท้ายจากคอลเล็กชัน
มีหลายวิธีในการรับเอกสาร n สุดท้ายในคอลเล็กชัน
มาดูวิธีหนึ่งโดยทำตามขั้นตอนต่อไปนี้
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงวิธีดำเนินการนี้
สมมติว่าเรามีคอลเลกชันพนักงานเดียวกันซึ่งมีชื่อฟิลด์เป็น "Employeeid" และ "EmployeeName"
ลองสมมติว่าเรามีเอกสารต่อไปนี้ในคอลเลกชั่นของเรา:
รหัสพนักงาน | ชื่อพนักงาน |
---|---|
22 | นิวมาร์ติน |
2 | โมฮัน |
3 | โจ |
4 | โมฮันอาร์ |
100 | Guru99 |
6 | กูรัง |
7 | กูรู99 |
db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)
คำอธิบายรหัส:
1) เมื่อทำการสอบถามเอกสาร ให้ใช้ฟังก์ชัน sort เพื่อเรียงลำดับระเบียนแบบย้อนกลับตามค่าฟิลด์ _id ในคอลเล็กชัน โดยพื้นฐานแล้ว -1 หมายถึงการเรียงลำดับเอกสารแบบย้อนกลับหรือแบบลดหลั่น เพื่อให้เอกสารสุดท้ายกลายเป็นเอกสารแรกที่จะแสดง
2) จากนั้นใช้ข้อจำกัดเพื่อแสดงจำนวนบันทึกที่คุณต้องการ ที่นี่เราได้ตั้งค่าข้อ จำกัด (2) ดังนั้นมันจะดึงเอกสารสองฉบับสุดท้าย
หากดำเนินการคำสั่งสำเร็จ จะแสดงผลลัพธ์ต่อไปนี้:
Output:
ผลลัพธ์จะแสดงอย่างชัดเจนว่าเอกสารสองฉบับสุดท้ายในคอลเล็กชันถูกแสดง ดังนั้น เราได้แสดงอย่างชัดเจนแล้วว่าในการดึงเอกสาร 'n' ฉบับสุดท้ายในคอลเล็กชัน ก่อนอื่นเราต้องเรียงลำดับเอกสารจากมากไปน้อย จากนั้นจึงใช้คำสั่งจำกัดเพื่อส่งคืนเอกสาร 'n' ฉบับที่ต้องการ
หมายเหตุ: หากทำการค้นหาในสตริงที่มีความยาวมากกว่า 38,000 ตัวอักษร จะไม่แสดงผลลัพธ์ที่ถูกต้อง
สรุป
- การจับคู่รูปแบบสามารถทำได้โดยใช้ตัวดำเนินการ $regex ตัวดำเนินการนี้ใช้เพื่อค้นหาสตริงบางตัวในคอลเล็กชัน
- สัญลักษณ์ ^ และ $ สามารถใช้สำหรับการค้นหาข้อความทุกประการโดยมีการใช้ ^ เพื่อให้แน่ใจว่าสตริงเริ่มต้นด้วยอักขระบางตัว และใช้ $ เพื่อให้แน่ใจว่าสตริงลงท้ายด้วยอักขระบางตัว
- สามารถใช้ "i" ร่วมกับตัวดำเนินการ $regex เพื่อระบุความไม่คำนึงถึงตัวพิมพ์เล็ก/ใหญ่เพื่อให้สามารถค้นหาสตริงได้ ไม่ว่าจะเป็นตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่ก็ตาม
- ตัวคั่น // สามารถใช้เพื่อจับคู่รูปแบบได้
- ใช้การผสมผสานของการเรียงลำดับและฟังก์ชันขีดจำกัดเพื่อส่งคืนเอกสาร n สุดท้ายในคอลเลกชัน ฟังก์ชันการเรียงลำดับสามารถใช้เพื่อส่งคืนเอกสารตามลำดับจากมากไปน้อย หลังจากนั้นสามารถใช้ส่วนคำสั่งจำกัดเพื่อจำกัดจำนวนเอกสารที่ส่งคืน