MongoDB Regulært udtryk (Regex) med eksempler
Regulære udtryk bruges til mønstermatchning, som grundlæggende er til at finde strenge i dokumenter.
Nogle gange, når du henter dokumenter i en samling, ved du måske ikke præcis, hvad den nøjagtige feltværdi du skal søge efter. Derfor kan man bruge regulære udtryk til at hjælpe med at hente data baseret på mønstermatchende søgeværdier.
Brug af $regex-operator til mønstermatchning
regex-operator i MongoDB bruges til at søge efter specifikke strenge i samlingen. Følgende eksempel viser, hvordan dette kan gøres.
Lad os antage, at vi har vores samme medarbejdersamling, som har feltnavnene "Medarbejder-id" og "Medarbejdernavn". Lad os også antage, at vi har følgende dokumenter i vores samling.
Medarbejder-ID | Ansattes navn |
---|---|
22 | NewMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Gurang |
Her i nedenstående kode har vi brugt regex-operator til at specificere søgekriterierne.
db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)
Kodeforklaring:
- Her ønsker vi at finde alle medarbejdernavne, som har tegnene 'Gu' i sig. Derfor angiver vi $regex-operatoren for at definere søgekriterierne for 'Gu'
- Printjson'en bliver brugt til at udskrive hvert dokument, som returneres af forespørgslen på en bedre måde.
Hvis kommandoen udføres med succes, vil følgende output blive vist:
Output:
Outputtet viser tydeligt, at de dokumenter, hvori medarbejdernavnet indeholder 'Gu'-tegnene, returneres.
Hvis du antager, at din samling har følgende dokumenter med et yderligere dokument, der indeholdt medarbejdernavnet som "Guru999". Hvis du indtastede søgekriterierne som "Guru99", ville det også returnere dokumentet, som havde "Guru999". Men antag, hvis vi ikke ønskede dette og kun ville returnere dokumentet med "Guru99". Så kan vi gøre dette med nøjagtig mønstermatchning. For at lave en nøjagtig mønstermatchning bruger vi tegnet ^ og $. Vi tilføjer tegnet ^ i begyndelsen af strengen og $ i slutningen af strengen.
Medarbejder-ID | Ansattes navn |
---|---|
22 | NewMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Gurang |
8 | Guru999 |
Følgende eksempel viser, hvordan dette kan gøres.
db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)
Kodeforklaring:
- Her i søgekriterierne bruger vi tegnet ^ og $. ^ bruges til at sikre, at strengen starter med et bestemt tegn, og $ bruges til at sikre, at strengen slutter med et bestemt tegn. Så når koden udføres, henter den kun strengen med navnet "Guru99".
- Printjson'en bliver brugt til at udskrive hvert dokument, som returneres af forespørgslen på en bedre måde.
Hvis kommandoen udføres med succes, vil følgende output blive vist:
Output:
I outputtet er det tydeligt synligt, at strengen "Guru99" er hentet.
Mønstermatching med $optioner
Når du bruger regex-operatoren, kan man også give yderligere muligheder ved at bruge $optioner søgeord. Antag for eksempel, at du ønskede at finde alle de dokumenter, der havde 'Gu' i deres medarbejdernavn, uanset om det var store og små bogstaver eller ufølsomt. Hvis et sådant resultat ønskes, skal vi bruge $optioner med parameter for små og store bogstaver.
Følgende eksempel viser, hvordan dette kan gøres.
Lad os antage, at vi har vores samme medarbejdersamling, som har feltnavnene "Medarbejder-id" og "Medarbejdernavn".
Lad os også antage, at vi har følgende dokumenter i vores samling.
Medarbejder-ID | Ansattes navn |
---|---|
22 | NewMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Gurang |
7 | GURU99 |
Hvis vi nu kører den samme forespørgsel som i det sidste emne, ville vi aldrig se dokumentet med "GURU99" i resultatet. For at sikre, at dette kommer i resultatsættet, skal vi tilføje parameteren $options "I".
db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)
Kodeforklaring:
- $options med 'I'-parameteren (som betyder ufølsomhed for store og små bogstaver) angiver, at vi ønsker at udføre søgningen, uanset om vi finder bogstaverne 'Gu' med små eller store bogstaver.
Hvis kommandoen udføres med succes, vil følgende output blive vist:
Output:
- Outputtet viser tydeligt, at selvom et dokument har store bogstaver 'Gu', bliver dokumentet stadig vist i resultatsættet.
Mønstermatching uden regex-operatoren
Man kan også lave mønstermatching uden regex-operatoren. Følgende eksempel viser, hvordan dette kan gøres.
db.Employee.find({EmployeeName: /Gu/'}).forEach(printjson)
Kodeforklaring:
- "//"-mulighederne betyder grundlæggende at angive dine søgekriterier inden for disse afgrænsninger. Derfor specificerer vi /Gu/ for igen at finde de dokumenter, der har 'Gu' i deres medarbejdernavn.
Hvis kommandoen udføres med succes, vil følgende output blive vist:
Output:
Outputtet viser tydeligt, at de dokumenter, hvori medarbejdernavnet indeholder 'Gu'-tegnene, returneres.
Henter sidste 'n' dokumenter fra en samling
Der er forskellige måder at få de sidste n dokumenter i en samling.
Lad os se på en af måderne via de følgende trin
Følgende eksempel viser, hvordan dette kan gøres.
Lad os antage, at vi har vores samme medarbejdersamling, som har feltnavnene "Medarbejder-id" og "Medarbejdernavn".
Lad os også antage, at vi har følgende dokumenter i vores samling:
Medarbejder-ID | Ansattes navn |
---|---|
22 | NewMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Gurang |
7 | GURU99 |
db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)
Kodeforklaring:
1) Når du forespørger efter dokumenterne, skal du bruge sorteringsfunktionen til at sortere posterne i omvendt rækkefølge baseret på _id feltværdien i samlingen. -1 angiver grundlæggende at sortere dokumenterne i omvendt eller faldende rækkefølge, så det sidste dokument bliver det første dokument, der vises.
2) Brug derefter limit-klausulen til blot at vise det antal poster, du ønsker. Her har vi sat grænsesætningen (2), så den henter de sidste to dokumenter.
Hvis kommandoen udføres med succes, vil følgende output blive vist:
Output:
Outputtet viser tydeligt, at de to sidste dokumenter i samlingen vises. Derfor har vi tydeligt vist, at for at hente de sidste 'n'-dokumenter i samlingen, kan vi først sortere dokumenterne i faldende rækkefølge og derefter bruge grænseklausulen til at returnere 'n'-antallet af dokumenter, som er påkrævet.
Bemærk: Hvis søgningen udføres på en streng, der er større end f.eks. 38,000 tegn, vil den ikke vise de rigtige resultater.
Resumé
- Mønstermatching kan opnås af $regex-operatoren. Denne operator kan bruges til at finde bestemte strenge i samlingen.
- ^- og $-symbolet kan bruges til nøjagtige tekstsøgninger, hvor ^ bruges til at sikre, at strengen starter med et bestemt tegn, og $ bruges til at sikre, at strengen slutter med et bestemt tegn.
- 'i'et sammen med $regex-operatoren kan bruges til at angive ufølsomhed for store og små bogstaver, så strenge kan søges, uanset om de er med små eller store bogstaver.
- Afgrænsningerne // kan også bruges til mønstermatchning.
- Brug en kombination af sortering og grænsefunktionen til at returnere de sidste n dokumenter i samlingen. Sorteringsfunktionen kan bruges til at returnere dokumenterne i faldende rækkefølge, hvorefter grænsesætningen kan bruges til at begrænse antallet af dokumenter, der returneres.