บทความนี้แนะนำการใช้ Regular Expression (Regex) ใน MongoDB เพื่อทำ Pattern Matching คล้ายคำสั่ง LIKE ใน MySQL
สร้างข้อมูลตัวอย่าง
> db.likeInMongoDBDemo.insertOne({"Name" : "Sam"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd6922857806ebf1256f123") }
> db.likeInMongoDBDemo.insertOne({"Name" : "John" });
{ "acknowledged" : true, "insertedId" : ObjectId("5cd6923157806ebf1256f124") }
> db.likeInMongoDBDemo.insertOne({"Name" : "Scott"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd6924557806ebf1256f125") }
> db.likeInMongoDBDemo.insertOne({"Name" : "Sean"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd6924f57806ebf1256f126") }
> db.likeInMongoDBDemo.insertOne({"Name" : "Samuel"});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd6925857806ebf1256f127") }
แสดงข้อมูลทั้งหมด
> db.likeInMongoDBDemo.find().pretty();
{ "_id" : ObjectId("5cd6922857806ebf1256f123"), "Name" : "Sam" }
{ "_id" : ObjectId("5cd6923157806ebf1256f124"), "Name" : "John" }
{ "_id" : ObjectId("5cd6924557806ebf1256f125"), "Name" : "Scott" }
{ "_id" : ObjectId("5cd6924f57806ebf1256f126"), "Name" : "Sean" }
{ "_id" : ObjectId("5cd6925857806ebf1256f127"), "Name" : "Samuel" }
ค้นหาชื่อที่ขึ้นต้นด้วย "Sam" (คล้าย LIKE 'Sam%')
> db.likeInMongoDBDemo.find({"Name":{$regex:"Sam"}});
ผลลัพธ์
{ "_id" : ObjectId("5cd6922857806ebf1256f123"), "Name" : "Sam" }
{ "_id" : ObjectId("5cd6925857806ebf1256f127"), "Name" : "Samuel" }
การเปรียบเทียบ MySQL LIKE vs MongoDB Regex
| MySQL LIKE | MongoDB Regex | คำอธิบาย |
|---|---|---|
LIKE 'Sam%' | { $regex: '^Sam' } | ขึ้นต้นด้วย Sam |
LIKE '%Sam' | { $regex: 'Sam$' } | ลงท้ายด้วย Sam |
LIKE '%Sam%' | { $regex: 'Sam' } | มี Sam อยู่ที่ไหนก็ได้ |
LIKE 'Sa_m' | { $regex: 'Sa.m' } | ตัวอักษรเดี่ยว (dot = any char) |
LIKE 'Sa[%_]m' | { $regex: 'Sa[%.]m' } | Character class |
ตัวเลือก Regex Options
// Case insensitive (ไม่สนใจพิมพ์เล็ก/ใหญ่)
db.collection.find({ name: { $regex: "sam", $options: "i" } });
// Multiline (^ และ $ match ทุกบรรทัด)
db.collection.find({ desc: { $regex: "^start", $options: "m" } });
// Extended (ignore whitespace และ comments ใน pattern)
db.collection.find({ text: { $regex: "pattern", $options: "x" } });
ประสิทธิภาพ (Performance)
- Regex ที่ขึ้นต้นด้วย
^(Prefix) สามารถใช้ Index ได้ (Index Scan) - Regex ที่นำหน้าด้วย
.*หรือไม่มี Anchor จะทำ Full Collection Scan (ช้า) - ควรใช้ Text Index สำหรับ Full-text Search แทน Regex หากเป็นไปได้