MongoDB Reguljärt uttryck (Regex) med exempel
Reguljära uttryck används för mönstermatchning, vilket i grunden är för att hitta strängar i dokument.
Ibland när du hämtar dokument i en samling vet du kanske inte exakt vilket fältvärde du ska söka efter. Därför kan man använda reguljära uttryck för att hjälpa till att hämta data baserat på mönstermatchande sökvärden.
Använder operatorn $regex för mönstermatchning
Smakämnen regex-operator i MongoDB används för att söka efter specifika strängar i samlingen. Följande exempel visar hur detta kan göras.
Låt oss anta att vi har samma anställningssamling som har fältnamnen "Anställd" och "Anställd". Låt oss också anta att vi har följande dokument i vår samling.
Anställnings-ID | Anställd Namn |
---|---|
22 | NewMartin |
2 | Mohan |
3 | joe |
4 | MohanR |
100 | Guru99 |
6 | Gurang |
Här i koden nedan har vi använt regexoperator för att ange sökkriterierna.
db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)
Kodförklaring:
- Här vill vi hitta alla anställdas namn som har tecknen 'Gu' i sig. Därför anger vi $regex-operatorn för att definiera sökkriterierna för 'Gu'
- Printjson används för att skriva ut varje dokument som returneras av frågan på ett bättre sätt.
Om kommandot utförs framgångsrikt kommer följande utdata att visas:
Produktion:
Utdata visar tydligt att de dokument där anställds namn innehåller "Gu"-tecknen returneras.
Om du antar att din samling har följande dokument med ett ytterligare dokument som innehöll den anställdes namn som "Guru999". Om du skrev in sökkriteriet som "Guru99", skulle det också returnera dokumentet som hade "Guru999". Men tänk om vi inte ville ha detta och bara ville returnera dokumentet med "Guru99". Då kan vi göra detta med exakt mönstermatchning. För att göra en exakt mönstermatchning använder vi tecknen ^ och $. Vi lägger till tecknet ^ i början av strängen och $ i slutet av strängen.
Anställnings-ID | Anställd Namn |
---|---|
22 | NewMartin |
2 | Mohan |
3 | joe |
4 | MohanR |
100 | Guru99 |
6 | Gurang |
8 | Guru999 |
Följande exempel visar hur detta kan göras.
db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)
Kodförklaring:
- Här i sökkriterierna använder vi tecknen ^ och $. ^ används för att säkerställa att strängen börjar med ett visst tecken, och $ används för att säkerställa att strängen slutar med ett visst tecken. Så när koden körs kommer den bara att hämta strängen med namnet "Guru99".
- Printjson används för att skriva ut varje dokument som returneras av frågan på ett bättre sätt.
Om kommandot utförs framgångsrikt kommer följande utdata att visas:
Produktion:
I utgången är det tydligt synligt att strängen "Guru99" hämtas.
Mönstermatchning med $options
När du använder regexoperatorn kan man också tillhandahålla ytterligare alternativ genom att använda $alternativ nyckelord. Anta till exempel att du ville hitta alla dokument som hade "Gu" i deras anställdas namn, oavsett om det var skiftlägeskänsligt eller okänsligt. Om ett sådant resultat önskas måste vi använda $alternativ med parameter för skiftlägesokänslighet.
Följande exempel visar hur detta kan göras.
Låt oss anta att vi har samma anställningssamling som har fältnamnen "Anställd" och "Anställd".
Låt oss också anta att vi har följande dokument i vår samling.
Anställnings-ID | Anställd Namn |
---|---|
22 | NewMartin |
2 | Mohan |
3 | joe |
4 | MohanR |
100 | Guru99 |
6 | Gurang |
7 | GURU99 |
Om vi nu kör samma fråga som i det förra ämnet, skulle vi aldrig se dokumentet med "GURU99" i resultatet. För att säkerställa att detta kommer i resultatuppsättningen måste vi lägga till parametern $options "I".
db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)
Kodförklaring:
- $options med 'I'-parametern (som betyder skiftlägesokänslighet) anger att vi vill utföra sökningen oavsett om vi hittar bokstäverna 'Gu' med gemener eller versaler.
Om kommandot utförs framgångsrikt kommer följande utdata att visas:
Produktion:
- Utdata visar tydligt att även om ett dokument har versaler "Gu" visas dokumentet fortfarande i resultatuppsättningen.
Mönstermatchning utan regexoperatorn
Man kan också göra mönstermatchning utan regexoperatorn. Följande exempel visar hur detta kan göras.
db.Employee.find({EmployeeName: /Gu/'}).forEach(printjson)
Kodförklaring:
- Alternativen "//" betyder i princip att du specificerar dina sökkriterier inom dessa avgränsare. Därför anger vi /Gu/ för att återigen hitta de dokument som har 'Gu' i deras EmployeeName.
Om kommandot utförs framgångsrikt kommer följande utdata att visas:
Produktion:
Utdata visar tydligt att de dokument där anställds namn innehåller "Gu"-tecknen returneras.
Hämtar sista 'n' dokument från en samling
Det finns olika sätt att få de sista n dokumenten i en samling.
Låt oss titta på ett av sätten via följande steg
Följande exempel visar hur detta kan göras.
Låt oss anta att vi har samma anställningssamling som har fältnamnen "Anställd" och "Anställd".
Låt oss också anta att vi har följande dokument i vår samling:
Anställnings-ID | Anställd Namn |
---|---|
22 | NewMartin |
2 | Mohan |
3 | joe |
4 | MohanR |
100 | Guru99 |
6 | Gurang |
7 | GURU99 |
db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)
Kodförklaring:
1) När du frågar efter dokumenten, använd sorteringsfunktionen för att sortera posterna i omvänd ordning baserat på _id-fältvärdet i samlingen. -1 anger i princip att dokumenten ska sorteras i omvänd eller fallande ordning så att det sista dokumentet blir det första dokumentet som visas.
2) Använd sedan limitsatsen för att bara visa antalet poster du vill ha. Här har vi satt gränssatsen (2), så den kommer att hämta de två sista dokumenten.
Om kommandot utförs framgångsrikt kommer följande utdata att visas:
Produktion:
Utgången visar tydligt att de två sista dokumenten i samlingen visas. Därför har vi tydligt visat att för att hämta de sista 'n' dokumenten i samlingen kan vi först sortera dokumenten i fallande ordning och sedan använda gränssatsen för att returnera det 'n' antal dokument som krävs.
Anmärkningar: Om sökningen utförs på en sträng som är större än säg 38,000 XNUMX tecken, kommer den inte att visa rätt resultat.
Sammanfattning
- Mönstermatchning kan uppnås av $regex-operatorn. Denna operator kan användas för att hitta för vissa strängar i samlingen.
- Symbolerna ^ och $ kan användas för exakta textsökningar där ^ används för att säkerställa att strängen börjar med ett visst tecken och $ används för att säkerställa att strängen slutar med ett visst tecken.
- 'I' tillsammans med $regex-operatorn kan användas för att specificera skiftlägesokänslighet så att strängar kan sökas oavsett om de är i gemener eller versaler.
- Avgränsarna // kan också användas för mönstermatchning.
- Använd en kombination av sortering och limitfunktionen för att returnera de sista n dokumenten i samlingen. Sorteringsfunktionen kan användas för att returnera dokumenten i fallande ordning, varefter limitsatsen kan användas för att begränsa antalet dokument som returneras.