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

Tránh vấn đề hiệu suất MongoDB khi dùng Regex

Để 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" })