Разделете думата за търсене по думи и ги разделете с помощта на оператор за редуване ('|').
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');
За входа 'John Smith'
, това ще създаде регулярен израз, който изглежда като /John|Smith/ig
. Това ще върне true за отделни думи, както и ще работи, когато въведеното е само 'John Sm'
Можете да разиграете с този регулярен израз, за да получите друг, по-подходящ за вашите нужди.
РЕДАКТИРАНЕ:
Проблемът тук е, че вашите полета за име са отделни. В този случай прилагането на един и същ регулярен израз към двете полета няма да доведе до желаните резултати. Регулярният израз трябва да се приложи към същото поле с пълното име.
Възможно решение е използването на агрегиране:
User.aggregate()
.project({fullName: {$concat: ['$firstName', ' ', '$lastName']}})
.match({fullName: re})