การค้นหาข้อมูลแบบไม่สนใจตัวพิมพ์เล็ก/ใหญ่ (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 }- Flagi= 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)