Ce face $regex
$regex găsește documentele în care un câmp text se potrivește unei expresii regulate. În mongosh poți scrie direct literalul JavaScript /tipar/i sau forma { $regex: 'tipar', $options: 'i' }. Opțiuni: i (ignoră majusculele), m (multilinie), x, s.
Doar tiparele ancorate la început (/^Ana/), sensibile la majuscule, pot folosi eficient un index. Un tipar ca /ana/i verifică fiecare valoare din index sau din colecție, deci e lent pe colecții mari. Pentru căutare de cuvinte în texte, un index text sau Atlas Search sunt mai potrivite.
Parametri
| Parametru | Descriere |
|---|---|
$regex |
Expresia regulată (literal /…/ sau șir). |
$options |
i, m, x, s. |
Ce returnează
Un cursor cu documentele găsite.
Exemple
Exemplele de pe această pagină pornesc de la datele de mai jos. Rulează mai întâi acest cod, apoi exemplul.
use magazin
db.clienti.insertMany([
{ _id: 1, nume: 'Ana', email: 'ana@exemplu.ro', telefon: '0722000111' },
{ _id: 2, nume: 'Dan', email: null },
{ _id: 3, nume: 'Ioana', email: 'ioana@exemplu.ro', varsta: 28 },
{ _id: 4, nume: 'Mihai', varsta: '35' }
])
Exemplul 1: Adrese de email de pe un domeniu
Punctul se scrie \., iar $ ancorează la final.
db.clienti.find({ email: { $regex: /@exemplu\.ro$/ } }, { nume: 1, email: 1 })
Ieșire în mongosh
[
{ _id: 1, nume: 'Ana', email: 'ana@exemplu.ro' },
{ _id: 3, nume: 'Ioana', email: 'ioana@exemplu.ro' }
]
Exemplul 2: Nume care încep cu „an”, fără să conteze majusculele
Opțiunea i potrivește și „Ana”.
db.clienti.find({ nume: { $regex: '^an', $options: 'i' } }, { nume: 1 })
Ieșire în mongosh
[ { _id: 1, nume: 'Ana' } ]
Greșeli frecvente
- Textul introdus de utilizator trebuie „escapat” înainte de a fi pus într-un
$regex: caractere ca.,*,(schimbă sensul tiparului și pot face interogarea foarte lentă. /ana/nu potrivește „Ana”: expresiile regulate sunt sensibile la majuscule fără opțiuneai.- Diacriticele contează:
/Iasi/nu găsește „Iași”.
Comenzi înrudite
Index text și $text: Un index text permite căutarea după cuvinte în câmpuri de text, cu operatorul $text; o colecție poate avea un singur index text.$exists: Operatorul $exists găsește documentele care au (true) sau nu au (false) un anumit câmp, indiferent de valoarea lui.$match: Etapa $match păstrează în pipeline doar documentele care se potrivesc filtrului, cu aceeași sintaxă ca find().