MongoDB Reguliere expressie (Regex) met voorbeelden
Reguliere expressies worden gebruikt voor het matchen van patronen, wat in feite bedoeld is voor bevindingenreeksen in documenten.
Soms weet u bij het ophalen van documenten in een verzameling niet precies naar welke veldwaarde u precies moet zoeken. Daarom kan men reguliere expressies gebruiken om te helpen bij het ophalen van gegevens op basis van zoekwaarden voor patroonmatching.
Gebruik van de $regex-operator voor patroonherkenning
De regex-operator in MongoDB wordt gebruikt om te zoeken naar specifieke strings in de collectie. Het volgende voorbeeld laat zien hoe dit kan worden gedaan.
Laten we aannemen dat we dezelfde Employee-collectie hebben met de veldnamen "Employeeid" en "EmployeeName". Laten we ook aannemen dat we de volgende documenten in onze collectie hebben.
| Werknemer-id | Naam werknemer |
|---|---|
| 22 | NieuwMartin |
| 2 | Mohan |
| 3 | Joe |
| 4 | MohanR |
| 100 | Guru99 |
| 6 | Gurang |
In de onderstaande code hebben we een regex-operator gebruikt om de zoekcriteria te specificeren.
db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)
Code Verklaring:
- Hier willen we alle werknemersnamen vinden die de tekens 'Gu' bevatten. Daarom specificeren we de $regex operator om de zoekcriteria van 'Gu' te definiëren.
- De printjson wordt gebruikt om elk document dat door de query wordt geretourneerd, op een betere manier af te drukken.
Als de opdracht succesvol is uitgevoerd, wordt de volgende uitvoer weergegeven:
Output:
Uit de uitvoer blijkt duidelijk dat de documenten waarin de werknemersnaam de 'Gu'-tekens bevat, worden geretourneerd.
Stel dat uw verzameling de volgende documenten bevat met een extra document dat de werknemersnaam bevat als "Guru999". Als u de zoekcriteria invoert als "Guru99", zou het ook het document retourneren dat "Guru999" bevatte. Maar stel dat we dit niet willen en alleen het document met "Guru99" willen retourneren. Dan kunnen we dit doen met exacte patroonmatching. Om een exacte patroonmatching te doen, gebruiken we het ^ en $ teken. We voegen het ^ teken toe aan het begin van de string en $ aan het einde van de string.
| Werknemer-id | Naam werknemer |
|---|---|
| 22 | NieuwMartin |
| 2 | Mohan |
| 3 | Joe |
| 4 | MohanR |
| 100 | Guru99 |
| 6 | Gurang |
| 8 | Guru999 |
Het volgende voorbeeld laat zien hoe dit gedaan kan worden.
db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)
Code Verklaring:
- Hier in de zoekcriteria gebruiken we het teken ^ en $. De ^ wordt gebruikt om ervoor te zorgen dat de string met een bepaald teken begint, en $ wordt gebruikt om ervoor te zorgen dat de string met een bepaald teken eindigt. Dus wanneer de code wordt uitgevoerd, wordt alleen de string met de naam “Guru99” opgehaald.
- De printjson wordt gebruikt om elk document dat door de query wordt geretourneerd, op een betere manier af te drukken.
Als de opdracht succesvol is uitgevoerd, wordt de volgende uitvoer weergegeven:
Output:
In de uitvoer is duidelijk zichtbaar dat de string “Guru99” wordt opgehaald.
Patroonmatching met $options
Bij gebruik van de regex-operator kunt u ook extra opties bieden door gebruik te maken van de $ options trefwoord. Stel dat u bijvoorbeeld alle documenten wilt vinden die 'Gu' in hun werknemersnaam hebben, ongeacht of deze hoofdlettergevoelig of niet-gevoelig is. Als een dergelijk resultaat gewenst is, moeten we de $ options met hoofdletterongevoeligheidsparameter.
Het volgende voorbeeld laat zien hoe dit gedaan kan worden.
Laten we aannemen dat we dezelfde werknemerscollectie hebben met de veldnamen 'Employeeid' en 'EmployeeName'.
Laten we ook aannemen dat we de volgende documenten in onze collectie hebben.
| Werknemer-id | Naam werknemer |
|---|---|
| 22 | NieuwMartin |
| 2 | Mohan |
| 3 | Joe |
| 4 | MohanR |
| 100 | Guru99 |
| 6 | Gurang |
| 7 | GURU99 |
Als we nu dezelfde query uitvoeren als in het vorige onderwerp, zouden we nooit het document met “GURU99” in het resultaat zien. Om ervoor te zorgen dat dit in de resultatenset komt, moeten we de parameter $options “I” toevoegen.
db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)
Code Verklaring:
- De parameter $options met 'I' (wat hoofdletterongevoeligheid betekent) specificeert dat we de zoekopdracht willen uitvoeren, ongeacht of we de letters 'Gu' in kleine of hoofdletters vinden.
Als de opdracht succesvol is uitgevoerd, wordt de volgende uitvoer weergegeven:
Output:
- Uit de uitvoer blijkt duidelijk dat, ook al heeft een document de hoofdletter 'Gu', het document toch in de resultatenset wordt weergegeven.
Patroonherkenning zonder de regex-operator
Je kunt ook patroonmatching doen zonder de regex operator. Het volgende voorbeeld laat zien hoe dit kan.
db.Employee.find({EmployeeName: /Gu/'}).forEach(printjson)
Code Verklaring:
- De “//”-opties betekenen in feite dat u uw zoekcriteria binnen deze scheidingstekens moet specificeren. Daarom specificeren we /Gu/ om opnieuw die documenten te vinden die 'Gu' in hun werknemersnaam hebben.
Als de opdracht succesvol is uitgevoerd, wordt de volgende uitvoer weergegeven:
Output:
Uit de uitvoer blijkt duidelijk dat de documenten waarin de werknemersnaam de 'Gu'-tekens bevat, worden geretourneerd.
Laatste 'n' documenten ophalen uit een collectie
Er zijn verschillende manieren om de laatste n documenten in een collectie te verkrijgen.
Laten we eens kijken naar een van de manieren via de volgende stappen
Het volgende voorbeeld laat zien hoe dit gedaan kan worden.
Laten we aannemen dat we dezelfde werknemerscollectie hebben met de veldnamen 'Employeeid' en 'EmployeeName'.
Laten we ook aannemen dat we de volgende documenten in onze collectie hebben:
| Werknemer-id | Naam werknemer |
|---|---|
| 22 | NieuwMartin |
| 2 | Mohan |
| 3 | Joe |
| 4 | MohanR |
| 100 | Guru99 |
| 6 | Gurang |
| 7 | GURU99 |
db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)
Code Verklaring:
1) Gebruik bij het opvragen van de documenten de sorteerfunctie om de records in omgekeerde volgorde te sorteren op basis van de veldwaarde _id in de verzameling. De -1 geeft in principe aan dat de documenten in omgekeerde volgorde of aflopende volgorde moeten worden gesorteerd, zodat het laatste document het eerste document wordt dat wordt weergegeven.
2) Gebruik vervolgens de limit-clausule om alleen het gewenste aantal records weer te geven. Hier hebben we de limietclausule (2) ingesteld, zodat de laatste twee documenten worden opgehaald.
Als de opdracht succesvol is uitgevoerd, wordt de volgende uitvoer weergegeven:
Output:
De uitvoer laat duidelijk zien dat de laatste twee documenten in de collectie worden weergegeven. Daarom hebben we duidelijk laten zien dat we om de laatste 'n' documenten in de collectie op te halen, eerst de documenten in aflopende volgorde kunnen sorteren en vervolgens de limietclausule kunnen gebruiken om het 'n' aantal vereiste documenten te retourneren.
Note: Als de zoekopdracht wordt uitgevoerd op een string die groter is dan bijvoorbeeld 38,000 tekens, worden niet de juiste resultaten weergegeven.
Samenvatting
- Patroonmatching kan worden bereikt door de operator $regex. Deze operator kan worden gebruikt om naar bepaalde strings in de verzameling te zoeken.
- Het ^- en $-symbool kan worden gebruikt voor exacte tekstzoekopdrachten, waarbij ^ wordt gebruikt om ervoor te zorgen dat de string begint met een bepaald teken en $ om ervoor te zorgen dat de string eindigt met een bepaald teken.
- De 'i' kan samen met de $regex-operator worden gebruikt om hoofdletterongevoeligheid aan te geven, zodat strings kunnen worden doorzocht, ongeacht of ze in kleine letters of hoofdletters zijn geschreven.
- De scheidingstekens // kunnen ook worden gebruikt voor patroonafstemming.
- Gebruik een combinatie van sorteren en de limietfunctie om de laatste n documenten in de verzameling te retourneren. De sorteerfunctie kan worden gebruikt om de documenten in aflopende volgorde terug te sturen, waarna de limit-clausule kan worden gebruikt om het aantal geretourneerde documenten te beperken.










