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

MongoDB Case-Insensitive Query ด้วย Regular Expression (Regex)

การค้นหาข้อมูลแบบไม่สนใจตัวพิมพ์เล็ก/ใหญ่ (Case-Insensitive) ใน MongoDB สามารถทำได้โดยใช้ Regular Expression (Regex) พร้อม Flag i เนื้อหานี้สาธิตการค้นหาชื่อ "chris brown" ทุกรูปแบบ (Chris brown, CHRIS BROWN, chris brown)

ตัวอย่างข้อมูลทดสอบ

> db.demo314.insertOne({"Name":"Chris brown"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e50d742f8647eb59e562056") }

> db.demo314.insertOne({"Name":"David Miller"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e50d743f8647eb59e562057") }

> db.demo314.insertOne({"Name":"CHRIS BROWN"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e50d744f8647eb59e562058") }

> db.demo314.insertOne({"Name":"DAVID MILLER"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e50d747f8647eb59e562059") }

> db.demo314.insertOne({"Name":"chris brown"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e50d749f8647eb59e56205a") }

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

> db.demo314.find();
{
  "_id" : ObjectId("5e50d742f8647eb59e562056"),
  "Name" : "Chris brown"
}
{
  "_id" : ObjectId("5e50d743f8647eb59e562057"),
  "Name" : "David Miller"
}
{
  "_id" : ObjectId("5e50d744f8647eb59e562058"),
  "Name" : "CHRIS BROWN"
}
{
  "_id" : ObjectId("5e50d747f8647eb59e562059"),
  "Name" : "DAVID MILLER"
}
{
  "_id" : ObjectId("5e50d749f8647eb59e56205a"),
  "Name" : "chris brown"
}

Query Case-Insensitive ด้วย Regex

> db.demo314.find({"Name": /chris brown/i});

ผลลัพธ์ (Match 3 รายการ)

{
  "_id" : ObjectId("5e50d742f8647eb59e562056"),
  "Name" : "Chris brown"
}
{
  "_id" : ObjectId("5e50d744f8647eb59e562058"),
  "Name" : "CHRIS BROWN"
}
{
  "_id" : ObjectId("5e50d749f8647eb59e56205a"),
  "Name" : "chris brown"
}

คำอธิบายและตัวเลือกอื่น

  • Syntax: { field: /pattern/flags } - Flag i = Case-Insensitive
  • รูปแบบอื่น: { Name: { $regex: "chris brown", $options: "i" } } (รองรับ Variable/Expression ได้)
  • Performance: Regex นำหน้า (Prefix) เช่น /^chris/i ใช้ Index ได้ แต่ /chris/i (Contains) จะ Collection Scan
  • สร้าง Case-Insensitive Index (MongoDB 3.4+):
    db.demo314.createIndex({ Name: 1 }, { collation: { locale: "en", strength: 2 } })
    แล้ว Query: db.demo314.find({Name: "chris brown"}).collation({locale:"en", strength:2})
  • Collation Strength: 1=Base char, 2=Case-insensitive, 3=Case-sensitive (Default)