Skip to content

MongoDB | find() ด้วย Regular Expression แบบไหน ใช้/ไม่ใช้ index

จริงๆ ผมว่าจะเขียนรื่องนี้นานแล้วแต่เดือนที่ผ่านมา (กันยายน) งานยุ่งๆ ระเบียบวินัยก็ค่อนข้างแย่ ทั้งออกกำลังกายและเขียนบล็อก เดือนที่แล้วเลยไม่ได้เขียนอะไรเป็นชิ้นเป็นอัน ขอยกยอดมาเขียน (แบบอู้ๆ อีกนั่นแหละ) เดือนนี้แล้วกัน

คำสั่ง find() ของ MongoDB นั้นรองรับการ query ด้วย Regular Expression โดยสามารถเขียน syntax แบบ PCRE (Perl Compatible Regular Expression) ตัวอย่างเช่น

หรือจะใช้ผ่าน option $regex แบบนี้ก็ได้

ข้อดีของการ query ด้วย regex คือมันสะดวกเพราะเราสามารถเขียน regex ระบุ pattern ที่ต้องการ MongoDB จะไล่ดูข้อมูลใน field ที่ระบุ อันไหน match กับ pattern ก็จะคืนค่าเป็น result กลับไป ถ้าข้อมูลน้อยๆ การไล่ดูทีละ document ก็ใช้เวลาไม่มาก แต่ถ้าข้อมูลเยอะการไล่ match ทีละ document นั้นช้าแน่นอนเพราะ time complexity เป็น O(n) แถมใช้ CPU เยอะอีกต่างหาก

ในเมื่อมันช้าเพราะไล่ match ทีละ document  งั้นก็ทำ index สิน่าจะช่วยได้ แต่ … ทำ index ก็มีทั้งกรณีที่ช่วยช่วยและไม่ช่วย แบบไนบ้างที่ใช้ index และแบบไหนที่ไม่ใช้ index

✓ ใช้ index

✗ ไม่ใช้ index

การ query ด้วย regex ก็พอช่วยในการ search ข้อมูลแบบง่ายๆ ได้ แม้ว่า MongoDB จะรองรับการสร้าง index สำหรับ Full-text search แล้วแต่โดยส่วนตัวผมว่าก็ไม่ค่อยแม่นยำเท่าไหร่ ยังจำเป็นต้องพิมพ์คำเต็มๆ เพื่อให้ค้นหาเจออยู่ ภาษาอังกฤษก็พอได้แต่ภาษาไทยยังไม่รองรับ ถ้าทำแอปพลิเคชันที่มีการ search แนะนำให้ใช้ซอฟต์แวร์อื่นอย่าง ElasticSearch หรือ Solr ดีกว่าครับ

Be First to Comment

Leave a Reply

Your email address will not be published.