Overweeg het gebruik van een tekstindex
met een $text
zoeken
. Het is misschien een veel betere oplossing dan het gebruik van reguliere expressies. Zoeken met tekst levert echter documenten op op basis van een score-algoritme, dus het kan zijn dat u enkele resultaten krijgt die niet alle zoekwoorden bevatten die u zoekt.
Als u geen tekstindex aan dit veld kunt of wilt toevoegen, zou het lastig zijn om een enkele reguliere expressie te gebruiken omdat u niet weet in welke volgorde deze woorden voorkomen. Ik beweer niet dat het onmogelijk is om te schrijven, maar je zult eindigen met een vreselijke gruwel, zelfs voor regex-normen. Het zou veel gemakkelijker zijn om de regex-operator meerdere keren te gebruiken door de $and
. te gebruiken exploitant.
Ook zal het gebruik van een spatie als scheidingsteken mislukken wanneer het woord aan het begin of einde van de string staat of gevolgd wordt door een punt of komma. Gebruik de woordgrens token (\b
) in plaats daarvan.
collection.find(
{ $and : [
{'documenttextfield': {'$regex': '\b' +keyword1+'\b'}},
{'documenttextfield': {'$regex': '\b' +keyword2+'\b'}},
{'documenttextfield': {'$regex': '\b' +keyword3+'\b'}},
]
});
Houd er rekening mee dat dit een erg langzame query is, omdat deze drie reguliere expressies op elk afzonderlijk document van de verzameling worden uitgevoerd. Als dit een prestatiekritische query is, moet u serieus overwegen of een tekstindex echt niet voldoet. Als dit niet lukt, zou de laatste strohalm zijn om eventuele trefwoorden uit het documenttextfield
te extraheren veld waarnaar iemand zou kunnen zoeken (wat elk uniek woord erin kan zijn) in een nieuw array-field documenttextfield_keywords
, maak een normale index op dat veld en zoek in dat veld met de $all
operator
(in dat geval geen reguliere expressie vereist).