Giải pháp của Chris Fulstow sẽ hoạt động (+1), tuy nhiên, nó có thể không hiệu quả, đặc biệt nếu bộ sưu tập của bạn rất lớn. Biểu thức chính quy không có gốc (những biểu thức không bắt đầu bằng ^
, neo biểu thức chính quy vào đầu chuỗi) và những biểu thức sử dụng i
cờ phân biệt chữ hoa chữ thường sẽ không sử dụng các chỉ mục, ngay cả khi chúng tồn tại.
Một tùy chọn thay thế mà bạn có thể xem xét là không chuẩn hóa dữ liệu của bạn để lưu trữ phiên bản viết thường của name
trường, ví dụ như name_lower
. Sau đó, bạn có thể truy vấn một cách hiệu quả (đặc biệt nếu nó được lập chỉ mục) cho các đối sánh chính xác không phân biệt chữ hoa chữ thường như:
db.collection.find({"name_lower": thename.toLowerCase()})
Hoặc với một đối sánh tiền tố (một biểu thức chính quy gốc) là:
db.collection.find( {"name_lower":
{ $regex: new RegExp("^" + thename.toLowerCase(), "i") } }
);
Cả hai truy vấn này sẽ sử dụng một chỉ mục trên name_lower
.