Separe o termo de pesquisa por palavras e separe-as usando um operador de alternância ('|').
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');
Para a entrada
'John Smith'
, isso criará um regex que se parece com /John|Smith/ig
. Isso retornará true para palavras individuais, bem como funcionará quando a entrada for apenas 'John Sm'
Você pode brincar com esta regex para obter uma mais adequada às suas necessidades.
EDITAR:
O problema aqui é que seus campos de nome são separados. Nesse caso, aplicar o mesmo regex a ambos os campos não resultará nos resultados desejados. A regex precisa ser aplicada ao mesmo campo com o nome completo.
Uma solução possível é usar agregação:
User.aggregate()
.project({fullName: {$concat: ['$firstName', ' ', '$lastName']}})
.match({fullName: re})