MongoDB Reguláris kifejezés ($regex) példákkal

⚡ Okos összefoglaló

MongoDB A reguláris kifejezések mintaillesztést végeznek a dokumentumokban található karakterláncok megtalálásához, a $regex operátor, a $options jelző (kis- és nagybetűk megkülönböztetése), a pontos egyezéseket jelző horgonyok, és perjel-elválasztók segítségével, ha a pontos mezőérték ismeretlen.

  • 🔍 $reguláriskifejezés Operator: A db.collection.find({field:{$regex:”pattern”}}) függvény a mintát tartalmazó dokumentumokat találja meg.
  • 🎯 Anchors: A ^ és a $ parancsok pontos egyezést kényszerítenek ki, a mintát a karakterlánc elejéhez és végéhez kötve.
  • 🔠 Kis- és nagybetűk megkülönböztetése: Az $options 'i' jelző a szöveget kis- vagy nagybetűtől függetlenül egyezik.
  • Perjel-elválasztók: Tekerjükping egy /…/-ban lévő minta illeszkedik a $regex operátor írása nélkül.
  • 📉 Utolsó N dokumentum: A sort({_id:-1}) és a limit(n) függvények kombinálásával a legújabb rekordokat kapjuk vissza.
  • 🤖 AI Assist: Az asszisztensek reguláris kifejezésmintákat építenek, és megjelölik a teljes gyűjtemény-szkennelés teljesítményköltségeit.

MongoDB Reguláris kifejezés (Regex)

A reguláris kifejezéseket mintaillesztésre használják, ami alapvetően karakterláncok keresésére szolgál a dokumentumokban.

Előfordulhat, hogy egy gyűjtemény dokumentumainak lekérésekor nem tudja pontosan, hogy pontosan mi a keresendő Mező érték. Ezért használhatunk reguláris kifejezéseket az adatok lekéréséhez a mintaillesztő keresési értékek alapján.

$regex operátor használata a mintaillesztéshez

A $regex operátor a következőben: MongoDB adott karakterláncok keresésére szolgál a gyűjteményben. A következő példa bemutatja, hogyan lehet ezt megtenni.

Tegyük fel, hogy ugyanazzal az Alkalmazott gyűjteménnyel rendelkezünk, amelynek mezőnevei „Alkalmazottazonosító” és „AlkalmazottNév”. Tegyük fel azt is, hogy a következő dokumentumok szerepelnek a gyűjteményünkben.

Munkavállalói azonosító Alkalmazott Neve
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang

Az alábbi kódban a $regex operátort használtuk a keresési feltételek megadásához.

$regex használatával Operator mintaillesztéshez

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

Code Magyarázat:

  1. Itt meg szeretnénk találni az összes olyan alkalmazott nevét, amely tartalmazza a 'Gu' karaktereket. Ezért a $regex operátort adjuk meg a 'Gu' keresési feltétel definiálásához.
  2. A printjson a lekérdezés által visszaadott dokumentumok jobb kinyomtatására szolgál.

Ha a parancs sikeresen végrehajtásra került, a következő kimenet jelenik meg:

output:

$regex használatával Operator mintaillesztéshez

A kimenet egyértelműen mutatja, hogy azok a dokumentumok, amelyekben az Employee Name tartalmazza a „Gu” karaktereket, visszaküldésre kerülnek.

Tegyük fel, hogy a gyűjteményed a következő dokumentumokat tartalmazza, valamint egy további dokumentumot, amelyben az alkalmazott neve „Guru999”. Ha a keresési feltételeket a következőképpen adta meg: „Guru99” esetén a „This is returned document” (A szöveg ebben a kódrészletben nem értelmezhető) szöveget is visszaadná.Guru999”. De tegyük fel, hogy ha ezt nem akarjuk, és csak a „Guru99”. Ezután ezt pontos mintaillesztéssel is megtehetjük. A pontos mintaillesztéshez a ^ és a $ karaktereket fogjuk használni. A ^ karaktert a karakterlánc elejére, a $ jelet pedig a karakterlánc végére tesszük.

Munkavállalói azonosító Alkalmazott Neve
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
8 Guru999

A következő példa bemutatja, hogyan lehet ezt megtenni.

$regex használatával Operator mintaillesztéshez

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

Code Magyarázat:

  1. A keresési feltételekben a ^ és $ karaktereket használjuk. A ^ jel biztosítja, hogy a karakterlánc egy adott karakterrel kezdődjön, a $ pedig biztosítja, hogy a karakterlánc egy adott karakterrel végződjön. Tehát a kód végrehajtásakor csak a „Guru99. "
  2. A printjson a lekérdezés által visszaadott dokumentumok jobb kinyomtatására szolgál.

Ha a parancs sikeresen végrehajtásra került, a következő kimenet jelenik meg:

output:

$regex használatával Operator mintaillesztéshez

A kimenetben jól látható, hogy a „Guru99”-et kértek le.

Mintaillesztés a $opciókkal

A $regex operátor használatakor további opciókat is megadhatunk a következővel: $opciók kulcsszó. Tegyük fel például, hogy meg akarja találni az összes olyan dokumentumot, amelynek alkalmazotti nevében „Gu” szerepel, függetlenül attól, hogy a kis- és nagybetűk megkülönböztetik-e, vagy nem. Ha ilyen eredményre vágyunk, akkor a $opciók a kis- és nagybetűk közötti különbségtételt nem mutató paraméterrel.

A következő példa bemutatja, hogyan lehet ezt megtenni.

Tegyük fel, hogy ugyanazzal az Alkalmazott gyűjteménnyel rendelkezünk, amelynek mezőnevei „Alkalmazott azonosítója” és „Alkalmazott neve”.

Tegyük fel azt is, hogy a következő dokumentumok szerepelnek a gyűjteményünkben.

Munkavállalói azonosító Alkalmazott Neve
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
7 GURU99

Ha ugyanazt a lekérdezést futtatnánk, mint az előző témában, soha nem látnánk a „GURU99”-et tartalmazó dokumentumot az eredményben. Annak érdekében, hogy ez biztosan szerepeljen az eredményhalmazban, hozzá kell adnunk a $options „i” paramétert.

Mintaillesztés a $opciókkal

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

Code Magyarázat:

  1. Az 'i' paraméterrel ellátott $options (ami kis- és nagybetűk megkülönböztetését jelenti) azt adja meg, hogy a keresést akkor is végre akarjuk hajtani, ha a 'Gu' betűket kis- vagy nagybetűvel találjuk.

Ha a parancs sikeresen végrehajtásra került, a következő kimenet jelenik meg:

output:

Mintaillesztés a $opciókkal

  1. A kimenet egyértelműen mutatja, hogy bár az egyik dokumentumban nagybetűs 'Gu' szerepel, a dokumentum továbbra is megjelenik az eredményhalmazban.

Mintaillesztés a regex operátor nélkül

A mintaillesztést a $regex operátor nélkül is elvégezhetjük. A következő példa bemutatja, hogyan lehet ezt megtenni.

Mintaillesztés a Regex nélkül Operator

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

Code Magyarázat:

  1. A „//” elválasztójelek lényegében a keresési feltételek megadását jelentik ezen elválasztójeleken belül. Ezért a /Gu/ karakterláncot adjuk meg, hogy ismét megtaláljuk azokat a dokumentumokat, amelyek EmployeeName-jében szerepel a „Gu” karakterlánc.

Ha a parancs sikeresen végrehajtásra került, a következő kimenet jelenik meg:

output:

Mintaillesztés a Regex nélkül Operator

A kimenet egyértelműen mutatja, hogy azok a dokumentumok, amelyekben az Employee Name tartalmazza a „Gu” karaktereket, visszaküldésre kerülnek.

Utolsó „n” dokumentum lekérése egy gyűjteményből

Különféle módon lehet megszerezni a gyűjtemény utolsó n dokumentumát.

Nézzük meg az egyik módszert a következő lépéseken keresztül.

A következő példa bemutatja, hogyan lehet ezt megtenni.

Tegyük fel, hogy ugyanazzal az Alkalmazott gyűjteménnyel rendelkezünk, amelynek mezőnevei „Alkalmazott azonosítója” és „Alkalmazott neve”.

Tegyük fel azt is, hogy a következő dokumentumok szerepelnek a gyűjteményünkben:

Munkavállalói azonosító Alkalmazott Neve
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
7 GURU99

Az utolsó n dokumentum lekérése egy gyűjteményből

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

Code Magyarázat:

  1. Dokumentumok lekérdezésekor a rendezési függvény segítségével rendezze a rekordokat fordított sorrendben a gyűjtemény _id mezőértéke alapján. A -1 alapvetően azt jelzi, hogy a dokumentumokat fordított vagy csökkenő sorrendben kell rendezni, így az utolsó dokumentum lesz az első megjelenített dokumentum.
  2. Ezután a limit záradékkal jelenítsük meg a kívánt rekordok számát. Itt beállítottuk a limit záradékot (2), így az utolsó két dokumentumot fogja lekérni.

Ha a parancs sikeresen végrehajtásra került, a következő kimenet jelenik meg:

output:

Az utolsó n dokumentum lekérése egy gyűjteményből

A kimeneten jól látható, hogy a gyűjtemény utolsó két dokumentuma jelenik meg. Ezért világosan megmutattuk, hogy a gyűjtemény utolsó „n” dokumentumának lekéréséhez először a dokumentumokat csökkenő sorrendbe rendezhetjük, majd a limitzáradékkal visszaadhatjuk a szükséges „n” számú dokumentumot.

Megjegyzések: Ha a keresést mondjuk 38,000 XNUMX karakternél hosszabb karakterláncon hajtják végre, akkor nem a megfelelő eredményeket jeleníti meg.

GYIK

Anchor a ^ és $ jellel ellátott mintát. A „^” mintaGuru„99$” típusú találatokGuru99” és elutasítja a „Guru999”, mivel a ^ jel a karakterlánc elejét, a $ pedig a végét köti össze.

Csak a ^ előtaggal rendelkező kis- és nagybetűérzékeny minták használnak hatékonyan indexet. A lehorgonyzás nélküli vagy kis- és nagybetűérzékeny minták teljes gyűjteményes vizsgálatot indítanak el, ezért lehetőség szerint lehorgonyozzuk az előtagot.

A metakaraktereket, például a pontot, csillagot, pluszjelet vagy zárójeleket fordított perjellel kell megelőzni. Például a literális „.com” végződés mintája megkerüli a pontot, így nem kezeli más karakterként.

A $regex rugalmas mintaillesztést végez egyetlen mezőn, és képes a teljes gyűjteményt átvizsgálni. A $text szövegindexet használ a gyors, szóalapú kereséshez az indexelt mezők között, de nem támogatja a részlegesen részleges karakterláncmintákat.

Igen. Ha a keresett karakterlánc meghaladja a nagyjából 38 000 karaktert, előfordulhat, hogy a lekérdezés nem ad vissza helyes eredményeket. A megbízható egyezés érdekében tartsa a mintákat és a célmezőket ezen a korláton belül.

Tárold a mező kisbetűs másolatát a kis- és nagybetűket nem megkülönböztető keresésekhez, használj ^ karaktert a horgonymintákhoz, és nagy gyűjtemények esetén részesíts előnyben szöveges indexet vagy Atlas Search-et a lehorgonyzás nélküli $regex helyett.

A mesterséges intelligencia asszisztensei a sima angol szabályokat $regex mintákká alakítják, hozzáadják a megfelelő horgonyokat és $options jelzőt, és figyelmeztetnek, ha egy lekérdezés lassú, teljes gyűjteményes vizsgálatot indít el.

Igen. Egy AI Copilot átírja a lehorgonyzatlan mintákat, szöveges indexet vagy Atlas Search-et ajánl, és a kis- és nagybetűket nem megkülönböztető $regexet kisbetűs mezőkereséssé alakítja a sebesség érdekében.

Foglald össze ezt a bejegyzést a következőképpen: