MongoDB Säännöllinen lauseke ($regex) esimerkkeineen

⚡ Älykäs yhteenveto

MongoDB Säännölliset lausekkeet suorittavat kuvioiden yhteensovitusta löytääkseen merkkijonoja dokumenteista käyttämällä $regex-operaattoria, $options-lippua kirjainkoon epäherkkyyden havaitsemiseksi, ankkureita tarkkojen osumien havaitsemiseksi ja kauttaviivaerottimia, kun tarkka kentän arvo on tuntematon.

  • 🔍 $regex Operator: db.collection.find({field:{$regex:”pattern”}}) löytää dokumentit, jotka sisältävät mallin.
  • 🎯 Anchors: ^ ja $ pakottavat täsmälleen oikeat osumat sitomalla kuvion merkkijonon alkuun ja loppuun.
  • 🔠 Kirjainkoon epäherkkyys: $options 'i' -lippu löytää sopivan tekstin riippumatta siitä, onko kyseessä isot vai pienet kirjaimet.
  • Vinoviivojen erottimet: Kääriping /…/-merkissä oleva kuvio täsmää ilman $regex-operaattoria.
  • 📉 Viimeiset N dokumenttia: Yhdistä sort({_id:-1}) ja limit(n) palauttaaksesi uusimmat tietueet.
  • 🤖 AI Assist: Assistentit rakentavat säännöllisiä lausekkeita ja merkitsevät koko kokoelman skannauksen suorituskykykustannukset.

MongoDB Säännöllinen lauseke (Regex)

Säännöllisiä lausekkeita käytetään kuvioiden yhteensovittamiseen, eli merkkijonojen löytämiseen dokumenteista.

Joskus kun haet asiakirjoja kokoelmasta, et ehkä tiedä tarkalleen mitä kenttää etsit. Näin ollen voidaan käyttää säännöllisiä lausekkeita auttamaan tietojen hakemisessa mallia vastaavien hakuarvojen perusteella.

$regex-operaattorin käyttäminen kuvioiden sovittamiseen

$regex-operaattori kohdassa MongoDB käytetään tiettyjen merkkijonojen etsimiseen kokoelmasta. Seuraava esimerkki osoittaa, kuinka tämä voidaan tehdä.

Oletetaan, että meillä on sama työntekijäkokoelma, jonka kenttänimet ovat ”Työntekijätunnus” ja ”TyöntekijänNimi”. Oletetaan myös, että kokoelmassamme on seuraavat asiakirjat.

Henkilöstökortti työntekijän nimi
22 Uusi Martin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang

Tässä alla olevassa koodissa olemme käyttäneet $regex-operaattoria hakuehtojen määrittämiseen.

$regexin käyttö Operator kuvioiden yhdistämiseen

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

Code Selitys:

  1. Tässä osiossa haluamme löytää kaikki työntekijöiden nimet, joissa on merkkejä 'Gu'. Siksi määritämme $regex-operaattorin hakuehdoksi 'Gu'.
  2. Printjsonia käytetään jokaisen kyselyn palauttaman asiakirjan tulostamiseen paremmalla tavalla.

Jos komento suoritetaan onnistuneesti, seuraava tulos näytetään:

lähtö:

$regexin käyttö Operator kuvioiden yhdistämiseen

Tulos osoittaa selvästi, että ne asiakirjat, joissa Työntekijän nimi sisältää "Gu"-merkit, palautetaan.

Jos oletetaan, että kokoelmassasi on seuraavat asiakirjat ja lisäasiakirja, jossa työntekijän nimi on "Guru999”. Jos syötit hakukriteerit muodossa ”Guru99”, se palauttaisi myös dokumentin, jossa oli ”Guru999”. Mutta entä jos emme haluaisi tätä ja haluaisimme vain palauttaa asiakirjan, jossa on ”Guru99”. Sitten voimme tehdä tämän tarkalla kuvion täsmäyksellä. Tarkan kuvion täsmäyksen suorittamiseksi käytämme ^- ja $-merkkejä. Lisäämme ^-merkin merkkijonon alkuun ja $-merkin merkkijonon loppuun.

Henkilöstökortti työntekijän nimi
22 Uusi Martin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
8 Guru999

Seuraava esimerkki osoittaa, kuinka tämä voidaan tehdä.

$regexin käyttö Operator kuvioiden yhdistämiseen

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

Code Selitys:

  1. Tässä hakuehdoissa käytämme ^- ja $-merkkejä. ^-merkkiä käytetään varmistamaan, että merkkijono alkaa tietyllä merkillä, ja $-merkkiä käytetään varmistamaan, että merkkijono päättyy tiettyyn merkkiin. Joten suoritettaessa koodi noutaa vain merkkijonon nimeltä "Guru99. "
  2. Printjsonia käytetään jokaisen kyselyn palauttaman asiakirjan tulostamiseen paremmalla tavalla.

Jos komento suoritetaan onnistuneesti, seuraava tulos näytetään:

lähtö:

$regexin käyttö Operator kuvioiden yhdistämiseen

Tulosteessa näkyy selvästi, että merkkijono “Guru99” noudetaan.

Mallin yhteensopivuus $optioilla

$regex-operaattoria käytettäessä voidaan antaa myös lisäasetuksia käyttämällä $optiot avainsana. Oletetaan esimerkiksi, että haluat löytää kaikki asiakirjat, joiden työntekijän nimessä oli "Gu", riippumatta siitä, onko kirjainkoolla merkitystä vai ei. Jos tällaista tulosta halutaan, meidän on käytettävä $optiot kirjainkokoa ei erotella -parametrilla.

Seuraava esimerkki osoittaa, kuinka tämä voidaan tehdä.

Oletetaan, että meillä on sama työntekijäkokoelma, jonka kenttänimet ovat ”Työntekijätunnus” ja ”TyöntekijänNimi”.

Oletetaan myös, että kokoelmassamme on seuraavat asiakirjat.

Henkilöstökortti työntekijän nimi
22 Uusi Martin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
7 GURU99

Jos nyt suoritamme saman kyselyn kuin edellisessä aiheessa, emme koskaan näe tuloksessa dokumenttia, jonka teksti on ”GURU99”. Jotta tämä varmasti näkyisi tulosjoukossa, meidän on lisättävä $options ”i” -parametri.

Mallin yhteensopivuus $optioilla

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

Code Selitys:

  1. $options-muuttuja ja 'i'-parametri (eli kirjainkokoa ei erotella) määrittävät, että haku suoritetaan riippumatta siitä, löydämmekö 'Gu' kirjaimet pieninä vai isoina kirjaimina.

Jos komento suoritetaan onnistuneesti, seuraava tulos näytetään:

lähtö:

Mallin yhteensopivuus $optioilla

  1. Tuloste osoittaa selvästi, että vaikka yhdessä dokumentissa on isolla kirjaimella 'Gu', dokumentti näkyy silti tulosjoukossa.

Kuvion täsmäytys ilman regex-operaattoria

Hahmontunnistusta voidaan tehdä myös ilman $regex-operaattoria. Seuraava esimerkki näyttää, miten tämä voidaan tehdä.

Kuvioiden sovitus ilman säännöllistä lauseketta OperaTor

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

Code Selitys:

  1. ”//”-erottimet tarkoittavat pohjimmiltaan hakuehtojen määrittämistä näiden erottimien sisällä. Siksi määritämme /Gu/ löytääksemme jälleen ne asiakirjat, joiden EmployeeName-kentässä on 'Gu'.

Jos komento suoritetaan onnistuneesti, seuraava tulos näytetään:

lähtö:

Kuvioiden sovitus ilman säännöllistä lauseketta OperaTor

Tulos osoittaa selvästi, että ne asiakirjat, joissa Työntekijän nimi sisältää "Gu"-merkit, palautetaan.

Haetaan viimeisiä 'n' asiakirjoja kokoelmasta

On olemassa useita tapoja saada kokoelman viimeiset n asiakirjaa.

Tarkastellaan yhtä tapaa seuraavien vaiheiden avulla.

Seuraava esimerkki osoittaa, kuinka tämä voidaan tehdä.

Oletetaan, että meillä on sama työntekijäkokoelma, jonka kenttänimet ovat ”Työntekijätunnus” ja ”TyöntekijänNimi”.

Oletetaan myös, että kokoelmassamme on seuraavat asiakirjat:

Henkilöstökortti työntekijän nimi
22 Uusi Martin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
7 GURU99

Haetaan viimeisiä n dokumenttia kokoelmasta

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

Code Selitys:

  1. Kun haet asiakirjoja, käytä lajittelufunktiota lajitellaksesi tietueet käänteiseen järjestykseen kokoelman _id-kentän arvon perusteella. -1 tarkoittaa pohjimmiltaan asiakirjojen lajittelua käänteiseen eli laskevaan järjestykseen siten, että viimeisestä asiakirjasta tulee ensimmäinen näytettävä asiakirja.
  2. Käytä sitten limit-lauseketta näyttääksesi vain haluamasi määrän tietueita. Tässä olemme asettaneet limit-lausekkeen (2), joten se hakee kaksi viimeistä dokumenttia.

Jos komento suoritetaan onnistuneesti, seuraava tulos näytetään:

lähtö:

Haetaan viimeisiä n dokumenttia kokoelmasta

Tulos osoittaa selvästi, että kokoelman kaksi viimeistä dokumenttia näkyvät. Tästä syystä olemme selvästi osoittaneet, että noutaaksemme kokoelman viimeisen n-asiakirjan voimme ensin lajitella asiakirjat laskevaan järjestykseen ja sitten käyttää rajalauseketta palauttaaksemme vaaditun n-määrän asiakirjoja.

Huomautuksia: Jos haku suoritetaan merkkijonolle, joka on pitempi kuin esimerkiksi 38,000 XNUMX merkkiä, se ei näytä oikeita tuloksia.

UKK

Anchor kuvio, jossa on ^ ja $. Kuvio “^Guru99$” vain osumia “Guru99” ja hylkää ”Guru999”, koska ^ sitoo merkkijonon alun ja $ sitoo lopun.

Vain kirjainkokoa erottavat mallit, joissa on etuliite ^, käyttävät indeksiä tehokkaasti. Ankkuroimattomat tai kirjainkokoa ei erottelevat mallit käynnistävät täyden kokoelman skannauksen, joten ankkuroi etuliite aina kun mahdollista.

Lisää metamerkkien, kuten pisteen, tähden, plusmerkin tai sulkeiden, eteen kenoviiva. Esimerkiksi literaalin ".com"-päätteen mallissa piste poistetaan, joten sitä ei käsitellä minä tahansa merkkinä.

$regex suorittaa joustavan kuvioiden yhteensovituksen yhdessä kentässä ja voi skannata koko kokoelman. $text käyttää teksti-indeksiä nopeaan sanapohjaiseen hakuun indeksoiduissa kentissä, mutta ei tue osittaisia ​​alimerkkijonoja.

Kyllä. Kun haettu merkkijono ylittää noin 38 000 merkkiä, kysely ei välttämättä palauta oikeita tuloksia. Pidä mallit ja kohdekentät tämän rajan sisällä luotettavan vastaavuuden varmistamiseksi.

Tallenna kentän kopio pienillä kirjaimilla kirjoitettuna hakuja varten, käytä ankkurikuvioissa merkkiä ^ ja käytä suurissa kokoelmissa mieluummin tekstimuotoista indeksiä tai Atlas-hakua kuin ankkuroimatonta $regex-muuttujaa.

Tekoälyavustajat muuttavat selkokieliset säännöt $regex-malleiksi, lisäävät oikeat ankkurit ja $options-lipun ja varoittavat, kun kysely laukaisee hitaan täyden kokoelman skannauksen.

Kyllä. Tekoälyyn perustuva apupilotin avulla ankkuroimattomat mallit voidaan kirjoittaa uudelleen, suositella teksti-indeksiä tai Atlas-hakua ja muuntaa kirjainkokoa ei-merkitsevän $regex-lausekkeen pienillä kirjaimilla kirjoitetuksi kentänhauksi nopeuden parantamiseksi.

Tiivistä tämä viesti seuraavasti: