MongoDB Expresie regulată ($regex) cu exemple

⚡ Rezumat inteligent

MongoDB Expresiile regulate efectuează potrivirea de șabloane pentru a găsi șiruri de caractere în documente, folosind operatorul $regex, indicatorul $options pentru insensibilitatea la majuscule/minuscule, ancore pentru potriviri exacte și delimitatori slash atunci când valoarea exactă a câmpului este necunoscută.

  • 🔍 $regex Operator: db.collection.find({field:{$regex:”pattern”}}) caută documente care conțin modelul.
  • 🎯 Anchors: ^ și $ forțează potriviri exacte, legând modelul la începutul și sfârșitul șirului de caractere.
  • 🔠 Insensibilitate la majuscule/minuscule: Indicatorul $options 'i' potrivește textul indiferent de majuscule sau minuscule.
  • ➗ Delimitatori bară oblică: Wrapping un model din /…/ se potrivește fără a scrie operatorul $regex.
  • 📉 Ultimele N documente: Combină sort({_id:-1}) cu limit(n) pentru a returna cele mai noi înregistrări.
  • 🤖 Asistență AI: Asistenții construiesc modele regex și semnalează costurile de performanță pentru scanarea completă a colecției.

MongoDB Expresie regulată (Regex)

Expresiile regulate sunt folosite pentru potrivirea modelelor, care este practic pentru găsirea șirurilor de caractere în documente.

Uneori, atunci când preluați documente dintr-o colecție, este posibil să nu știți exact care este valoarea exactă a câmpului pe care să o căutați. Prin urmare, se pot folosi expresii regulate pentru a ajuta la preluarea datelor bazate pe valorile de căutare potrivite pentru modele.

Folosind operatorul $regex pentru potrivirea modelelor

Operatorul $regex din MongoDB este folosit pentru a căuta anumite șiruri din colecție. Următorul exemplu arată cum se poate face acest lucru.

Să presupunem că avem aceeași colecție Angajați care are numele de câmp „Employeeid” și „EmployeeName”. Să presupunem, de asemenea, că avem următoarele documente în colecția noastră.

Card de identitate al angajatului numele angajatului
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang

În codul de mai jos am folosit operatorul $regex pentru a specifica criteriile de căutare.

Folosind $regex Operator pentru Potrivirea modelelor

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

Code Explicaţie:

  1. Aici dorim să găsim toate numele angajaților care conțin caracterele „Gu”. Prin urmare, specificăm operatorul $regex pentru a defini criteriile de căutare pentru „Gu”.
  2. Printjson este folosit pentru a imprima fiecare document care este returnat de interogare într-un mod mai bun.

Dacă comanda este executată cu succes, va fi afișată următoarea ieșire:

ieșire:

Folosind $regex Operator pentru Potrivirea modelelor

Rezultatul arată în mod clar că acele documente în care numele angajatului conține caracterele „Gu” sunt returnate.

Dacă presupunem că colecția dvs. are următoarele documente, împreună cu un document suplimentar care conține numele angajatului ca „Guru999”. Dacă ați introdus criteriile de căutare ca „Guru99”, ar returna și documentul care avea „Guru999”. Dar să presupunem că nu am dori acest lucru și am dori doar să returnăm documentul cu „Guru99”. Apoi putem face acest lucru cu potrivirea exactă a modelelor. Pentru a face o potrivire exactă a modelelor, vom folosi caracterele ^ și $. Vom adăuga caracterul ^ la începutul șirului și $ la sfârșitul șirului.

Card de identitate al angajatului numele angajatului
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
8 Guru999

Următorul exemplu arată cum se poate face acest lucru.

Folosind $regex Operator pentru Potrivirea modelelor

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

Code Explicaţie:

  1. Aici, în criteriile de căutare, folosim caracterele ^ și $. ^ este folosit pentru a ne asigura că șirul începe cu un anumit caracter, iar $ este folosit pentru a ne asigura că șirul se termină cu un anumit caracter. Așadar, atunci când codul se execută, va prelua doar șirul cu numele „Guru99. "
  2. Printjson este folosit pentru a imprima fiecare document care este returnat de interogare într-un mod mai bun.

Dacă comanda este executată cu succes, va fi afișată următoarea ieșire:

ieșire:

Folosind $regex Operator pentru Potrivirea modelelor

În rezultat, este clar vizibil șirul „GuruSe preiau 99”.

Potrivirea modelului cu $opțiuni

Când se utilizează operatorul $regex, se pot oferi și opțiuni suplimentare utilizând $opțiuni cuvânt cheie. De exemplu, să presupunem că doriți să găsiți toate documentele care au avut „Gu” în numele angajatului lor, indiferent dacă au fost sensibile la majuscule sau minuscule. Dacă se dorește un astfel de rezultat, atunci trebuie să folosim $opțiuni cu parametrul de insensibilitate la majuscule/minuscule.

Următorul exemplu arată cum se poate face acest lucru.

Să presupunem că avem aceeași colecție de angajați care are numele de câmp „Employeeid” și „EmployeeName”.

Să presupunem, de asemenea, că avem următoarele documente în colecția noastră.

Card de identitate al angajatului numele angajatului
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
7 GURU99

Acum, dacă rulăm aceeași interogare ca în subiectul precedent, nu vom vedea niciodată documentul cu „GURU99” în rezultat. Pentru a ne asigura că acesta apare în setul de rezultate, trebuie să adăugăm parametrul „i” din $options.

Potrivirea modelului cu $opțiuni

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

Code Explicaţie:

  1. Opțiunile $ cu parametrul 'i' (care înseamnă insensibilitate la majuscule/minuscule) specifică faptul că dorim să efectuăm căutarea indiferent dacă găsim literele 'Gu' cu majuscule sau minuscule.

Dacă comanda este executată cu succes, va fi afișată următoarea ieșire:

ieșire:

Potrivirea modelului cu $opțiuni

  1. Rezultatul arată clar că, deși un document are majuscula „Gu”, documentul este totuși afișat în setul de rezultate.

Potrivirea modelului fără operatorul regex

Se poate face și potrivirea de șabloane fără operatorul $regex. Următorul exemplu arată cum se poate face acest lucru.

Potrivirea modelelor fără Regex OperaTdR

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

Code Explicaţie:

  1. Delimitatorii „//” au, practic, scopul de a specifica criteriile de căutare în cadrul acestor delimitatori. Prin urmare, specificăm /Gu/ pentru a găsi din nou acele documente care au „Gu” în NumeleAngajatului.

Dacă comanda este executată cu succes, va fi afișată următoarea ieșire:

ieșire:

Potrivirea modelelor fără Regex OperaTdR

Rezultatul arată în mod clar că acele documente în care numele angajatului conține caracterele „Gu” sunt returnate.

Preluarea ultimelor „n” documente dintr-o colecție

Există diferite moduri de a obține ultimele n documente dintr-o colecție.

Să analizăm una dintre modalități prin următorii pași.

Următorul exemplu arată cum se poate face acest lucru.

Să presupunem că avem aceeași colecție de angajați care are numele de câmp „Employeeid” și „EmployeeName”.

Să presupunem, de asemenea, că avem următoarele documente în colecția noastră:

Card de identitate al angajatului numele angajatului
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
7 GURU99

Preluarea ultimelor n documente dintr-o colecție

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

Code Explicaţie:

  1. Când interogați documente, utilizați funcția de sortare pentru a sorta înregistrările în ordine inversă pe baza valorii câmpului _id din colecție. Valoarea -1 indică practic sortarea documentelor în ordine inversă sau descrescătoare, astfel încât ultimul document să devină primul document afișat.
  2. Apoi, folosiți clauza limit pentru a afișa doar numărul de înregistrări dorite. Aici am setat clauza limit (2), astfel încât va prelua ultimele două documente.

Dacă comanda este executată cu succes, va fi afișată următoarea ieșire:

ieșire:

Preluarea ultimelor n documente dintr-o colecție

Rezultatul arată clar că ultimele două documente din colecție sunt afișate. Prin urmare, am arătat clar că pentru a prelua ultimele „n” documente din colecție, putem mai întâi să sortăm documentele în ordine descrescătoare și apoi să folosim clauza limită pentru a returna numărul „n” de documente necesare.

notițe: Dacă căutarea este efectuată pe un șir care este mai mare decât să zicem 38,000 de caractere, nu va afișa rezultatele corecte.

Întrebări frecvente

Anchor modelul cu ^ și $. Modelul „^Guru„99$” se potrivește doar „Guru99” și respinge „Guru999”, deoarece ^ leagă începutul șirului, iar $ leagă sfârșitul.

Doar modelele care țin cont de majuscule și minuscule și care au prefixul ^ utilizează un index eficient. Modelele neancorate sau care nu țin cont de majuscule și minuscule declanșează o scanare completă a colecției, așadar ancorați prefixul ori de câte ori este posibil.

Metacaracterele precum punct, steluță, plus sau paranteze trebuie precedate de o bară oblică inversată. De exemplu, modelul pentru un caracter literal „.com” include punctul, astfel încât acesta nu este tratat ca un caracter oarecare.

`$regex` realizează potrivirea flexibilă a tiparelor pe un singur câmp și poate scana întreaga colecție. `$text` folosește un index de text pentru căutare rapidă bazată pe cuvinte în câmpurile indexate, dar nu acceptă tipare cu subșiruri parțiale.

Da. Când șirul căutat depășește aproximativ 38,000 de caractere, este posibil ca interogarea să nu returneze rezultate corecte. Păstrați modelele și câmpurile țintă în limita respectivă pentru o potrivire fiabilă.

Stocați o copie scrisă cu litere mici a câmpului pentru căutări care nu țin cont de majuscule/minuscule, ancorați modele cu ^ și preferați un index text sau o căutare Atlas pe colecții mari în loc de $regex neancorat.

Asistenții inteligenți artificiali transformă regulile din limba engleză simplă în modele $regex, adaugă ancorele și semnalizatoarele $options corecte și avertizează când o interogare va declanșa o scanare lentă a colecției complete.

Da. Un copilot bazat pe inteligență artificială rescrie modele neancorate, recomandă un index de text sau o căutare Atlas și convertește $regex fără distincție între majuscule și minuscule într-un câmp de căutare cu majuscule pentru viteză.

Rezumați această postare cu: