Tách cụm từ tìm kiếm theo các từ và tách chúng bằng toán tử thay thế ('|').
var terms = req.params.search.split(' ');
var regexString = "";
for (var i = 0; i < terms.length; i++)
{
regexString += terms[i];
if (i < terms.length - 1) regexString += '|';
}
var re = new RegExp(regexString, 'ig');
Đối với đầu vào 'John Smith'
, điều này sẽ tạo ra một regex trông giống như /John|Smith/ig
. Điều này sẽ trả về true cho các từ riêng lẻ cũng như hoạt động khi đầu vào chỉ là 'John Sm'
Bạn có thể chơi xung quanh với regex này để có được một regex khác phù hợp với nhu cầu của bạn.
CHỈNH SỬA:
Vấn đề ở đây là các trường tên của bạn tách biệt nhau. Trong trường hợp này, việc áp dụng cùng một regex cho cả hai trường sẽ không mang lại kết quả như bạn muốn. Regex cần được áp dụng cho cùng một trường với tên đầy đủ.
Một giải pháp khả thi là sử dụng tổng hợp:
User.aggregate()
.project({fullName: {$concat: ['$firstName', ' ', '$lastName']}})
.match({fullName: re})