MongoDB Reguljärt uttryck ($regex) med exempel

⚡ Smart sammanfattning

MongoDB reguljära uttryck utför mönstermatchning för att hitta strängar inuti dokument, med hjälp av operatorn $regex, flaggan $options för skiftlägesokänslighet, ankare för exakta matchningar och snedstreckavgränsare när det exakta fältvärdet är okänt.

  • 🔍 $ regex Operator: db.collection.find({field:{$regex:”pattern”}}) matchar dokument som innehåller mönstret.
  • 🎯 Anchors: ^ och $ tvingar fram exakta matchningar, vilket binder mönstret till strängens början och slut.
  • 🔠 Skiftlägeskänslighet: $options-flaggan 'i' matchar text oavsett om det är versaler eller gemener.
  • Snedstreckavgränsare: Wrapping ett mönster i /…/ matchar utan att skriva $regex-operatorn.
  • 📉 Senaste N dokumenten: Kombinera sort({_id:-1}) med limit(n) för att returnera de nyaste posterna.
  • 🤖 AI Assist: Assistenter bygger regex-mönster och flaggar prestandakostnader för full-collection-scanning.

MongoDB Reguljärt uttryck (Regex)

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

Operatorn $regex 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 Employee-samling som har fältnamnen "Employeeid" och "EmployeeName". 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 operatorn $regex för att ange sökkriterierna.

Använder $regex Operator för mönstermatchning

db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)

Code Förklaring:

  1. Här vill vi hitta alla anställningsnamn som innehåller tecknen 'Gu'. Därför anger vi operatorn $regex för att definiera sökkriterierna 'Gu'.
  2. 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:

Använder $regex Operator för mönstermatchning

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åller medarbetarens namn som "Guru999”. Om du angav sökkriterierna som “Guru99”, skulle det också returnera dokumentet som hade “Guru999”. Men anta att 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.

Använder $regex Operator för mönstermatchning

db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)

Code Förklaring:

  1. 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. "
  2. 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:

Använder $regex Operator för mönstermatchning

I utdata syns det tydligt att strängen "Guru99” är hämtad.

Mönstermatchning med $options

När man använder operatorn $regex kan man också ge 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 parametern för skiftlägesokänslighet.

Följande exempel visar hur detta kan göras.

Låt oss anta att vi har samma Employee-samling som har fältnamnen "Employeeid" och "EmployeeName".

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 ​​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 med i resultatmängden måste vi lägga till parametern "i" för $options.

Mönstermatchning med $options

db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)

Code Förklaring:

  1. $options med parametern 'i' (vilket 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:

Mönstermatchning med $options

  1. Utdata visar tydligt att även om ett dokument har versalerna 'Gu', visas dokumentet fortfarande i resultatmängden.

Mönstermatchning utan regexoperatorn

Man kan också göra mönstermatchning utan operatorn $regex. Följande exempel visar hur detta kan göras.

Mönstermatchning utan Regex Operator

db.Employee.find({EmployeeName: /Gu/}).forEach(printjson)

Code Förklaring:

  1. Avgränsarna "//" syftar i princip till att ange dina sökkriterier inom dessa avgränsare. Därför anger vi /Gu/ för att återigen hitta de dokument som har 'Gu' i sitt anställdsnamn.

Om kommandot utförs framgångsrikt kommer följande utdata att visas:

Produktion:

Mönstermatchning utan Regex Operator

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 Employee-samling som har fältnamnen "Employeeid" och "EmployeeName".

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

Hämtar de senaste n dokumenten från en samling

db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)

Code Förklaring:

  1. När du frågar efter dokument, använd sorteringsfunktionen för att sortera posterna i omvänd ordning baserat på _id-fältets värde i samlingen. -1 indikerar i princip att dokumenten ska sorteras i omvänd ordning eller fallande ordning så att det sista dokumentet blir det första dokumentet som visas.
  2. Använd sedan limit-klausulen för att bara visa antalet poster du vill ha. Här har vi satt limit-klausulen (2), så att den hämtar de två sista dokumenten.

Om kommandot utförs framgångsrikt kommer följande utdata att visas:

Produktion:

Hämtar de senaste n dokumenten från en samling

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.

Vanliga frågor

Anchor mönstret med ^ och $. Mönstret “^Guru99$” matchar endast “Guru99” och avvisar “Guru999”, eftersom ^ binder början av strängen och $ binder slutet.

Endast skiftlägeskänsliga mönster med prefixet ^ använder ett index effektivt. Mönster som inte är skiftlägeskänsliga eller inte är skiftlägeskänsliga utlöser en fullständig samlingssökning, så förankra prefixet när det är möjligt.

Föregå metatecken som punkt, stjärna, plus eller parenteser med ett bakåtsnedstreck. Till exempel, mönstret för en bokstavlig ".com"-ändelse undviker punkten så att det inte behandlas som vilket tecken som helst.

$regex gör flexibel mönstermatchning på ett fält och kan skanna hela samlingen. $text använder ett textindex för snabb ordbaserad sökning över indexerade fält men stöder inte partiella delsträngsmönster.

Ja. När den sökta strängen överstiger ungefär 38 000 tecken kan det hända att frågan inte returnerar korrekta resultat. Håll mönster och målfält inom den gränsen för tillförlitlig matchning.

Lagra en kopia av fältet med gemener för sökningar som inte är skiftlägeskänsliga, ankra mönster med ^ och föredra ett textindex eller Atlas-sökning på stora samlingar istället för icke-förankrad $regex.

AI-assistenter omvandlar vanliga engelska regler till $regex-mönster, lägger till korrekta ankare och $options-flaggor och varnar när en fråga utlöser en långsam fullständig samlingssökning.

Ja. En AI-copilot skriver om oförankrade mönster, rekommenderar ett textindex eller Atlas Search och konverterar skiftläges-okänslig $regex till en sökning med gemener för att öka hastigheten.

Sammanfatta detta inlägg med: