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.

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.
db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)
Code Magyarázat:
- 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.
- 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:
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.
db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)
Code Magyarázat:
- 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. "
- 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:
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.
db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)
Code Magyarázat:
- 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:
- 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.
db.Employee.find({EmployeeName: /Gu/}).forEach(printjson)
Code Magyarázat:
- 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:
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 |
db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)
Code Magyarázat:
- 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.
- 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:
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.










