MongoDB Regulært uttrykk ($regex) med eksempler

⚡ Smart oppsummering

MongoDB Regulære uttrykk utfører mønstersamsvar for å finne strenger i dokumenter, ved hjelp av $regex-operatoren, $options-flagget for ufølsomhet for store og små bokstaver, ankere for eksakte treff og skråstrek-skilletegn når den nøyaktige feltverdien er ukjent.

  • 🔍 $regex Operator: db.collection.find({field:{$regex:”pattern”}}) samsvarer med dokumenter som inneholder mønsteret.
  • 🎯 Anchors: ^ og $ tvinger frem eksakte treff, og binder mønsteret til strengens start og slutt.
  • 🔠 Ufølsomhet for store og små bokstaver: $options-flagget 'i' samsvarer med tekst uavhengig av store eller små bokstaver.
  • Skråstrek-skilletegn: Pakkping et mønster i /…/ samsvarer uten å skrive $regex-operatoren.
  • 📉 Siste N dokumenter: Kombiner sort({_id:-1}) med limit(n) for å returnere de nyeste postene.
  • 🤖 AI Assist: Assistenter bygger regex-mønstre og flagger ytelseskostnader for full samlingsskanning.

MongoDB Regulært uttrykk (Regex)

Regulære uttrykk brukes til mønstermatching, som i utgangspunktet er for å finne strenger i dokumenter.

Noen ganger når du henter dokumenter i en samling, vet du kanskje ikke nøyaktig hva den eksakte feltverdien du skal søke etter. Derfor kan man bruke regulære uttrykk for å hjelpe til med å hente data basert på mønstermatchende søkeverdier.

Bruker $regex-operator for mønstertilpasning

$regex-operatoren i MongoDB brukes til å søke etter spesifikke strenger i samlingen. Følgende eksempel viser hvordan dette kan gjøres.

La oss anta at vi har den samme ansattsamlingen vår, som har feltnavnene «AnsattID» og «Ansattnavn». La oss også anta at vi har følgende dokumenter i samlingen vår.

Ansatt-ID arbeidstakers navn
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang

Her i koden nedenfor har vi brukt $regex-operatoren til å spesifisere søkekriteriene.

Bruker $regex Operator for mønstertilpasning

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

Code Forklaring:

  1. Her ønsker vi å finne alle ansattnavn som inneholder tegnene «Gu». Derfor spesifiserer vi $regex-operatoren for å definere søkekriteriene «Gu».
  2. Printjson brukes til å skrive ut hvert dokument som returneres av spørringen på en bedre måte.

Hvis kommandoen utføres vellykket, vil følgende utgang vises:

Utgang:

Bruker $regex Operator for mønstertilpasning

Utdataene viser tydelig at de dokumentene der medarbeidernavnet inneholder "Gu"-tegnene returneres.

Hvis vi antar at samlingen din har følgende dokumenter med et tilleggsdokument som inneholder ansattnavnet som «Guru999”. Hvis du skrev inn søkekriteriene som «Guru99”, ville den også returnere dokumentet som hadde “Guru999”. Men la oss si at vi ikke ønsket dette, men bare ville returnere dokumentet med «Guru99”. Så kan vi gjøre dette med eksakt mønstergjenkjenning. For å gjøre en eksakt mønstergjenkjenning bruker vi tegnene ^ og $. Vi legger til tegnet ^ i begynnelsen av strengen og $ på slutten av strengen.

Ansatt-ID arbeidstakers navn
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
8 Guru999

Følgende eksempel viser hvordan dette kan gjøres.

Bruker $regex Operator for mønstertilpasning

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

Code Forklaring:

  1. Her i søkekriteriene bruker vi tegnene ^ og $. ^ brukes for å sikre at strengen starter med et bestemt tegn, og $ brukes for å sikre at strengen slutter med et bestemt tegn. Så når koden kjøres, vil den bare hente strengen med navnet «Guru99. "
  2. Printjson brukes til å skrive ut hvert dokument som returneres av spørringen på en bedre måte.

Hvis kommandoen utføres vellykket, vil følgende utgang vises:

Utgang:

Bruker $regex Operator for mønstertilpasning

I utdataene er det tydelig synlig at strengen «Guru99” er hentet.

Mønstermatching med $options

Når man bruker $regex-operatoren, kan man også gi flere alternativer ved å bruke $alternativer søkeord. Tenk deg for eksempel at du ønsket å finne alle dokumentene som hadde "Gu" i medarbeidernavnet, uavhengig av om det var store og små bokstaver eller ikke. Hvis et slikt resultat er ønsket, må vi bruke $alternativer med parameteren for ufølsomhet for store og små bokstaver.

Følgende eksempel viser hvordan dette kan gjøres.

La oss anta at vi har den samme ansatt-samlingen som har feltnavnene «Ansatt-ID» og «Ansattnavn».

La oss også anta at vi har følgende dokumenter i samlingen vår.

Ansatt-ID arbeidstakers navn
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
7 GURU99

Hvis vi kjører den samme spørringen som i forrige emne, vil vi aldri se dokumentet med «GURU99» i resultatet. For å sikre at dette kommer i resultatsettet, må vi legge til parameteren $options «i».

Mønstermatching med $options

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

Code Forklaring:

  1. $options med parameteren 'i' (som betyr at det ikke skilles mellom store og små bokstaver) spesifiserer at vi vil utføre søket uansett om vi finner bokstavene 'Gu' med små eller store bokstaver.

Hvis kommandoen utføres vellykket, vil følgende utgang vises:

Utgang:

Mønstermatching med $options

  1. Utdataene viser tydelig at selv om ett dokument har stor bokstav 'Gu', vises dokumentet fortsatt i resultatsettet.

Mønstertilpasning uten regex-operatoren

Man kan også gjøre mønstermatching uten $regex-operatoren. Følgende eksempel viser hvordan dette kan gjøres.

Mønstermatching uten Regex Operator

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

Code Forklaring:

  1. «//»-skilletegnene betyr i bunn og grunn å spesifisere søkekriteriene dine innenfor disse skilletegnene. Derfor spesifiserer vi /Gu/ for å igjen finne de dokumentene som har «Gu» i ansattnavnet.

Hvis kommandoen utføres vellykket, vil følgende utgang vises:

Utgang:

Mønstermatching uten Regex Operator

Utdataene viser tydelig at de dokumentene der medarbeidernavnet inneholder "Gu"-tegnene returneres.

Henter siste 'n' dokumenter fra en samling

Det er ulike måter å få tak i de siste n dokumentene i en samling.

La oss se på en av måtene via de følgende trinnene.

Følgende eksempel viser hvordan dette kan gjøres.

La oss anta at vi har den samme ansatt-samlingen som har feltnavnene «Ansatt-ID» og «Ansattnavn».

La oss også anta at vi har følgende dokumenter i samlingen vår:

Ansatt-ID arbeidstakers navn
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
7 GURU99

Henter siste n dokumenter fra en samling

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

Code Forklaring:

  1. Når du spør etter dokumenter, bruk sorteringsfunksjonen til å sortere postene i omvendt rekkefølge basert på verdien i _id-feltet i samlingen. -1 indikerer i utgangspunktet at dokumentene skal sorteres i omvendt rekkefølge eller synkende rekkefølge, slik at det siste dokumentet blir det første dokumentet som vises.
  2. Bruk deretter limit-klausulen til å bare vise antall poster du ønsker. Her har vi satt limit-klausulen (2), slik at den vil hente de to siste dokumentene.

Hvis kommandoen utføres vellykket, vil følgende utgang vises:

Utgang:

Henter siste n dokumenter fra en samling

Utdataene viser tydelig at de to siste dokumentene i samlingen vises. Derfor har vi tydelig vist at for å hente de siste 'n'-dokumentene i samlingen, kan vi først sortere dokumentene i synkende rekkefølge og deretter bruke grenseparagrafen for å returnere 'n' antall dokumenter som kreves.

Merknader: Hvis søket utføres på en streng som er større enn for eksempel 38,000 XNUMX tegn, vil den ikke vise de riktige resultatene.

Spørsmål og svar

Anchor mønsteret med ^ og $. Mønsteret «^Guru99$» samsvarer bare med «Guru99» og avviser «Guru999», fordi ^ binder starten av strengen og $ binder slutten.

Bare mønstre som skiller mellom store og små bokstaver og prefikset ^ bruker en indeks effektivt. Uforankrede eller store og små bokstaver-uavhengige mønstre utløser en fullstendig samlingsskanning, så forankre prefikset når det er mulig.

Sett en omvendt skråstrek foran metategn som punktum, stjerne, pluss eller parenteser. For eksempel, mønsteret for en bokstavelig «.com»-endelse omgår punktum, slik at det ikke behandles som et hvilket som helst tegn.

$regex gjør fleksibel mønstergjenkjenning på ett felt og kan skanne hele samlingen. $text bruker en tekstindeks for raskt ordbasert søk på tvers av indekserte felt, men støtter ikke delvise delstrengmønstre.

Ja. Når søkestrengen overstiger omtrent 38 000 tegn, kan det hende at spørringen ikke returnerer riktige resultater. Hold mønstre og målfelt innenfor denne grensen for pålitelig samsvar.

Lagre en liten kopi av feltet for oppslag som ikke skiller mellom store og små bokstaver, ankre mønstre med ^, og foretrekk en tekstindeks eller Atlas-søk på store samlinger i stedet for uforankret $regex.

AI-assistenter gjør om klare engelske regler til $regex-mønstre, legger til riktige ankere og $options-flagg, og advarer når en spørring vil utløse en langsom skanning av hele samlingen.

Ja. En AI-copilot omskriver ikke-forankrede mønstre, anbefaler en tekstindeks eller Atlas Search, og konverterer $regex som ikke skiller mellom store og små bokstaver til et oppslag med små felt for å sikre hastighet.

Oppsummer dette innlegget med: