MongoDB นิพจน์ปกติ ($regex) พร้อมตัวอย่าง
⚡ สรุปอย่างชาญฉลาด
MongoDB นิพจน์ปกติ (Regular expressions) ทำหน้าที่จับคู่รูปแบบเพื่อค้นหาสตริงภายในเอกสาร โดยใช้ตัวดำเนินการ $regex, แฟล็ก $options สำหรับการไม่คำนึงถึงตัวพิมพ์ใหญ่เล็ก, ตัวยึดสำหรับการจับคู่ที่ตรงกันทุกประการ และตัวคั่นแบบสแลชเมื่อไม่ทราบค่าฟิลด์ที่แน่นอน

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










