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.