Tot nu toe hebben we enkel gezien hoe we exacte waarden kunnen gebruiken om te filteren. MongoDB heeft ook een text search functionaliteit die je kan gebruiken om tekstuele velden te doorzoeken. Dit kan je gebruiken om bijvoorbeeld een zoekfunctionaliteit te maken.
Stel dat we een collectie hebben met de naam books
en we willen alle boeken vinden waarvan de titel het woord "MongoDB" bevat.
en
Deze collection bevat de volgende boeken:
Je kan reguliere expressies gebruiken om tekstuele velden te doorzoeken. Je kan een reguliere expressie meegeven aan de find
methode om te filteren op een bepaald patroon.
Dit geeft alle documenten terug waarvan het veld title
het woord "MongoDB" bevat.
Als je een case-insensitive zoekopdracht wil uitvoeren, dan kan je de i
vlag toevoegen aan de reguliere expressie.
Dit geeft alle documenten terug waarvan het veld title
het woord "MongoDB" bevat, ongeacht de case.
Wil je nu zoeken op een bepaalde variabelen, dan kan je de reguliere expressie dynamisch maken.
Je kan ook een text index aanmaken op een veld om te zoeken op tekst. Je kan een text index aanmaken door de createIndex
methode aan te roepen met als argument een object met als key het veld dat je wil indexeren en als value "text"
.
Dit zal een text index aanmaken op het veld title
. Je kan nu de $text
operator gebruiken om te zoeken op tekst.
Over het algemeen is het aanmaken van een text index en text search efficiƫnter dan het gebruik van reguliere expressies.
Dit geeft alle documenten terug waarvan het veld title
de woorden "MongoDB" en "database" bevat.
Text search is zelfs zo krachtig dat het het onderscheid kan maken tussen enkelvoud en meervoud.
zal ook het boek "MongoDB for Dummies" teruggeven want het bevat het woord "dummy" in het meervoud.
Text search houdt ook rekening met stopwoorden. Dit zijn woorden die vaak voorkomen en geen betekenis hebben. Deze worden genegeerd in de zoekopdracht.
Dit geeft geen resultaten terug omdat "the" een stopwoord is.
Als je wil zoeken op meerdere velden, dan kan je een text index aanmaken op meerdere velden.
De kans bestaat dat je een foutmelding krijgt omdat er al een index bestaat op het title veld. Je kan dit oplossen door eerst de index te verwijderen.
Dit zal alle indexen verwijderen.
Je kan nu zoeken op meerdere velden.
Dit geeft alle documenten terug waarvan het veld title
of summary
het woord "database" bevat.
Je kan ook de $language
optie meegeven aan de $text
operator om de taal van de tekst te specificeren.
Dit geeft alle documenten terug waarvan het veld title
of summary
het woord "konijnen" bevat in het Nederlands. En ja, het boek "Lief klein konijn" zal teruggegeven worden.
Wil je volledig taal onafhankelijk zoeken dan moet je de index aanmaken met de default_language
optie en deze op none
zetten.
Dit is ook handig als je meerdere talen in je collectie hebt en je geen rekening wil houden met stopwoorden en dergelijke.