Để thực hiện tìm kiếm không phân biệt chữ hoa chữ thường (case insensitive) trong MongoDB, bạn sử dụng toán tử $regex với flag i.
Cú pháp
Cách 1: Sử dụng regex string với anchor ^$
db.yourCollectionName.find({"yourFieldName" : { '$regex': '^yourValue$' }});
Cách 2: Sử dụng regex literal với flag i (khuyến khích)
db.yourCollectionName.find({"yourFieldName" : { '$regex': /^yourValue$/i }});
Ví dụ minh họa
Tạo collection và dữ liệu
> db.caseInsesitiveDemo.insertOne({"Name":"John"});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8bd66293c80e3f23815e83") }
> db.caseInsesitiveDemo.insertOne({"Name":"Johnson"});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8bd66693c80e3f23815e84") }
> db.caseInsesitiveDemo.insertOne({"Name":"Johny"});
{ "acknowledged" : true, "insertedId" : ObjectId("5c8bd66a93c80e3f23815e85") }
Xem tất cả documents
> db.caseInsesitiveDemo.find().pretty();
{
"_id" : ObjectId("5c8bd66293c80e3f23815e83"),
"Name" : "John"
}
{
"_id" : ObjectId("5c8bd66693c80e3f23815e84"),
"Name" : "Johnson"
}
{
"_id" : ObjectId("5c8bd66a93c80e3f23815e85"),
"Name" : "Johny"
}
Tìm kiếm thông thường (chứa "John")
> db.caseInsesitiveDemo.find({"Name" : { '$regex' : 'John' }});
{
"_id" : ObjectId("5c8bd66293c80e3f23815e83"),
"Name" : "John"
}
{
"_id" : ObjectId("5c8bd66693c80e3f23815e84"),
"Name" : "Johnson"
}
{
"_id" : ObjectId("5c8bd66a93c80e3f23815e85"),
"Name" : "Johny"
}
Trường hợp 1: Khớp chính xác, không phân biệt hoa/thường
> db.caseInsesitiveDemo.find({"Name" : { '$regex': '^John$' }});
{
"_id" : ObjectId("5c8bd66293c80e3f23815e83"),
"Name" : "John"
}
Chỉ khớp chính xác "John" (có phân biệt hoa/thường).
Trường hợp 2: Khớp chính xác, KHÔNG phân biệt hoa/thường (flag i)
> db.caseInsesitiveDemo.find({"Name" : { '$regex': /^John$/i }});
{
"_id" : ObjectId("5c8bd66293c80e3f23815e83"),
"Name" : "John"
}
Vẫn chỉ khớp "John" vì dữ liệu chỉ có "John" viết hoa chữ J đầu. Nếu có "john", "JOHN", "JoHn" cũng sẽ khớp.
So sánh các cách
| Cú pháp | Phân biệt hoa/thường | Khớp chính xác | Ví dụ khớp |
|---|---|---|---|
/John/ | Có | Không (contains) | John, Johnson, Johny |
/^John$/ | Có | Có | John |
/John/i | Không | Không | john, JOHN, John, jOhN... |
/^John$/i | Không | Có | john, JOHN, John, JoHn... |
Lưu ý hiệu năng
- Regex không có anchor (^ $) không dùng được index → full collection scan
- Regex có anchor ^ (prefix) có thể dùng index:
/^John/ - Flag
ilàm chậm query, cân nhắc lưu thêm trường lowercase để query nhanh