Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

ใช้ Regex ใน MongoDB แทน MySQL LIKE Statement

บทความนี้แนะนำการใช้ 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 LIKEMongoDB 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 หากเป็นไปได้