Oddziel wyszukiwane słowa słowami i oddziel je za pomocą operatora alternatywy ('|').
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');
Dla danych wejściowych 'John Smith'
, utworzy to wyrażenie regularne, które wygląda jak /John|Smith/ig
. To zwróci true dla pojedynczych słów, a także zadziała, gdy dane wejściowe to po prostu 'John Sm'
Możesz pobawić się z tym wyrażeniem regularnym, aby uzyskać jedno bardziej dopasowane do Twoich potrzeb.
EDYCJA:
Problem polega na tym, że pola twojego nazwiska są oddzielne. W takim przypadku zastosowanie tego samego wyrażenia regularnego do obu pól nie przyniesie pożądanych wyników. Wyrażenie regularne należy zastosować do tego samego pola z pełną nazwą.
Możliwym rozwiązaniem jest użycie agregacji:
User.aggregate()
.project({fullName: {$concat: ['$firstName', ' ', '$lastName']}})
.match({fullName: re})