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

MongoDB Regex: ค้นหาชื่อ "John" แบบ Case-Sensitive (ไม่จับ "john")

การค้นหาข้อความแบบ case-sensitive ใน MongoDB ใช้ regular expression literal /pattern/ โดยไม่ใส่ flag i จะจับเฉพาะตัวพิมพ์ใหญ่-เล็กที่ตรงกัน

สร้างคอลเลกชันและข้อมูลตัวอย่าง (มี John และ john)

> db.demo221.insertOne({"Details":{"StudentName":"Chris","StudentAge":21}});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3ee15d03d395bdc213472b") }
> db.demo221.insertOne({"Details":{"StudentName":"John","StudentAge":20}});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3ee16503d395bdc213472c") }
> db.demo221.insertOne({"Details":{"StudentName":"Bob","StudentAge":22}});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3ee16b03d395bdc213472d") }
> db.demo221.insertOne({"Details":{"StudentName":"john","StudentAge":24}});
{ "acknowledged" : true, "insertedId" : ObjectId("5e3ee17303d395bdc213472e") }

แสดงข้อมูลทั้งหมด

> db.demo221.find();

ผลลัพธ์: Chris, John, Bob, john (4 เอกสาร)

Query Regex Case-Sensitive: หา "John" เท่านั้น

> db.demo221.find({"Details.StudentName": /John/});

ผลลัพธ์

{ "_id" : ObjectId("5e3ee16503d395bdc213472c"), "Details" : { "StudentName" : "John", "StudentAge" : 20 } }

จับเฉพาะ "John" (J พิมพ์ใหญ่) ไม่จับ "john" (พิมพ์เล็กทั้งคำ)

Regex Syntax ใน MongoDB

ใช้ $regex Operator (Alternative Syntax)

// เทียบเท่า /John/
db.demo221.find({"Details.StudentName": {$regex: "John"}})

// Case-insensitive
db.demo221.find({"Details.StudentName": {$regex: "John", $options: "i"}})

// ใช้ variable
var name = "John";
db.demo221.find({"Details.StudentName": {$regex: name, $options: "i"}})

Performance: Index และ Regex

  • Prefix regex (/^John/ หรือ {$regex: "^John"}): ใช้ index ได้ (หากมี index บน field)
  • Contains regex (/John/): ไม่ใช้ index ต้อง full collection scan
  • Case-insensitive ($options: "i"): ไม่ใช้ index (ยกเว้น case-insensitive index)

สร้าง Case-Insensitive Index (MongoDB 3.4+)

db.demo221.createIndex(
  {"Details.StudentName": 1},
  {collation: {locale: "en", strength: 2}}  // strength 2 = case-insensitive
)

สรุป: ใช้ /pattern/ สำหรับ case-sensitive, /pattern/i หรือ {$regex: pattern, $options: "i"} สำหรับ case-insensitive

PatternความหมายCase Sensitive
/John/มี substring "John"Yes
/John/iมี substring "John" (case-insensitive)No
/^John$/เท่ากับ "John" ทั้งคำYes
/^John$/iเท่ากับ "John" ทั้งคำ (case-insensitive)No
/^Jo/ขึ้นต้นด้วย "Jo"Yes
/hn$/ลงท้ายด้วย "hn"Yes