Để tránh vấn đề hiệu suất khi dùng regex, hãy tạo index phù hợp (text index cho tìm kiếm văn bản). Tạo collection với text index:
> db.demo531.createIndex({"CountryName":"text","Name":"text"});
{ "createdCollectionAutomatically" : true, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
> db.demo531.insertOne({CountryName:"US","Name":"Chris"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8b2b60ef4dcbee04fbbbf2") }
> db.demo531.insertOne({CountryName:"UK","Name":"David"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8b2b6cef4dcbee04fbbbf3") }
> db.demo531.insertOne({CountryName:"AUS","Name":"chris"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8b2b74ef4dcbee04fbbbf4") }
> db.demo531.insertOne({CountryName:"US","Name":"CHRIS"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e8b2badef4dcbee04fbbbf5") }
Hiển thị dữ liệu:
> db.demo531.find();
Kết quả:
Tìm kiếm với regex (CountryName="US" VÀ Name khớp "chris" case-insensitive):
> db.demo531.find({CountryName: "US", "Name": { "$regex": "chris", "$options": "i" }}).limit(4);Kết quả khớp 2 tài liệu (Chris và CHRIS ở US):
Khuyến nghị hiệu suất:
- Text Index + $text: Hiệu quả hơn regex cho tìm kiếm toàn văn bản
- Anchored Regex:
/^pattern/(bắt đầu chuỗi) có thể dùng index,/pattern/(giữa chuỗi) thì không - Case-insensitive:
$options: "i"làm chậm truy vấn, cân nhắc lưu thêm trường lowercase - Limit kết quả: Luôn dùng
.limit()để tránh quét toàn bộ collection
Ví dụ dùng text search thay regex: db.demo531.find({ $text: { $search: "chris" }, CountryName: "US" })