Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Tìm kiếm không phân biệt chữ hoa chữ thường (case insensitive) trong MongoDB

Để 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ápPhân biệt hoa/thườngKhớp chính xácVí dụ khớp
/John/CóKhông (contains)John, Johnson, Johny
/^John$/CóCóJohn
/John/iKhôngKhôngjohn, JOHN, John, jOhN...
/^John$/iKhôngCó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 i làm chậm query, cân nhắc lưu thêm trường lowercase để query nhanh