MongoDB - นิพจน์ทั่วไป
Regular Expressions มักใช้ในทุกภาษาเพื่อค้นหารูปแบบหรือคำในสตริงใด ๆ MongoDB ยังมีฟังก์ชันการทำงานของนิพจน์ทั่วไปสำหรับการจับคู่รูปแบบสตริงโดยใช้$regexตัวดำเนินการ MongoDB ใช้ PCRE (Perl Compatible Regular Expression) เป็นภาษานิพจน์ทั่วไป
ไม่เหมือนกับการค้นหาข้อความเราไม่จำเป็นต้องกำหนดค่าหรือคำสั่งใด ๆ เพื่อใช้นิพจน์ทั่วไป
สมมติว่าเราได้แทรกเอกสารในฐานข้อมูลชื่อ posts ดังแสดงด้านล่าง -
> db.posts.insert(
{
"post_text": "enjoy the mongodb articles on tutorialspoint",
"tags": [
"mongodb",
"tutorialspoint"
]
}
WriteResult({ "nInserted" : 1 })
ใช้นิพจน์นิพจน์ทั่วไป
คำค้นหา regex ต่อไปนี้ค้นหาโพสต์ทั้งหมดที่มีสตริง tutorialspoint ในนั้น -
> db.posts.find({post_text:{$regex:"tutorialspoint"}}).pretty()
{
"_id" : ObjectId("5dd7ce28f1dd4583e7103fe0"),
"post_text" : "enjoy the mongodb articles on tutorialspoint",
"tags" : [
"mongodb",
"tutorialspoint"
]
}
{
"_id" : ObjectId("5dd7d111f1dd4583e7103fe2"),
"post_text" : "enjoy the mongodb articles on tutorialspoint",
"tags" : [
"mongodb",
"tutorialspoint"
]
}
>
แบบสอบถามเดียวกันสามารถเขียนเป็น -
>db.posts.find({post_text:/tutorialspoint/})
การใช้นิพจน์นิพจน์ทั่วไปที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่
เพื่อให้การค้นหาไม่คำนึงถึงตัวพิมพ์ใหญ่เราใช้ไฟล์ $options พารามิเตอร์ที่มีค่า $i. คำสั่งต่อไปนี้จะค้นหาสตริงที่มีคำtutorialspointโดยไม่คำนึงถึงตัวพิมพ์เล็กหรือใหญ่ -
>db.posts.find({post_text:{$regex:"tutorialspoint",$options:"$i"}})
หนึ่งในผลลัพธ์ที่ส่งกลับจากแบบสอบถามนี้คือเอกสารต่อไปนี้ซึ่งมีคำ tutorialspoint ในกรณีที่แตกต่างกัน -
{
"_id" : ObjectId("53493d37d852429c10000004"),
"post_text" : "hey! this is my post on TutorialsPoint",
"tags" : [ "tutorialspoint" ]
}
การใช้ regex สำหรับ Array Elements
เรายังสามารถใช้แนวคิดของ regex บนฟิลด์อาร์เรย์ สิ่งนี้มีความสำคัญอย่างยิ่งเมื่อเราใช้ฟังก์ชันของแท็ก ดังนั้นหากคุณต้องการค้นหาโพสต์ทั้งหมดที่มีแท็กเริ่มต้นจากคำว่าบทช่วยสอน (ไม่ว่าจะเป็นบทช่วยสอนหรือแบบฝึกหัดหรือ Tutorialpoint หรือ Tutorialphp) คุณสามารถใช้รหัสต่อไปนี้ -
>db.posts.find({tags:{$regex:"tutorial"}})
การเพิ่มประสิทธิภาพแบบสอบถามนิพจน์ทั่วไป
หากฟิลด์เอกสารเป็น indexedแบบสอบถามจะใช้ประโยชน์จากค่าที่จัดทำดัชนีเพื่อให้ตรงกับนิพจน์ทั่วไป ทำให้การค้นหารวดเร็วมากเมื่อเทียบกับนิพจน์ทั่วไปที่สแกนคอลเลคชันทั้งหมด
ถ้านิพจน์ทั่วไปคือ prefix expressionการจับคู่ทั้งหมดหมายถึงการเริ่มต้นด้วยอักขระสตริงบางตัว ตัวอย่างเช่นถ้านิพจน์ regex คือ^tutจากนั้นข้อความค้นหาจะต้องค้นหาเฉพาะสตริงที่ขึ้นต้นด้วย tut.