MongoDB Espressioni regolari ($regex) con esempi

⚡ Riepilogo intelligente

MongoDB Le espressioni regolari eseguono la corrispondenza di pattern per trovare stringhe all'interno dei documenti, utilizzando l'operatore $regex, il flag $options per l'insensibilità alle maiuscole/minuscole, gli ancoraggi per le corrispondenze esatte e i delimitatori slash quando il valore esatto del campo non è noto.

  • 🔍 $regex Operare: db.collection.find({field:{$regex:”pattern”}}) trova i documenti che contengono il modello.
  • 🎯 Anchors: ^ e $ forzano la corrispondenza esatta, associando il pattern all'inizio e alla fine della stringa.
  • 🔠 Insensibilità alle maiuscole/minuscole: Il flag 'i' di $options corrisponde al testo indipendentemente dal fatto che sia maiuscolo o minuscolo.
  • Delimitatori barra: Avvolgereping un pattern in /…/ corrisponde senza scrivere l'operatore $regex.
  • 📉 Ultimi N documenti: Combina sort({_id:-1}) con limit(n) per restituire i record più recenti.
  • 🤖 Assistenza AI: Gli assistenti creano modelli di espressioni regolari e segnalano i costi prestazionali della scansione completa della raccolta.

MongoDB Espressione regolare (Regex)

Le espressioni regolari vengono utilizzate per la corrispondenza di modelli, che consiste fondamentalmente nel trovare stringhe all'interno dei documenti.

A volte, quando si recuperano documenti in una raccolta, potresti non sapere esattamente quale sia l'esatto valore del campo da cercare. Pertanto, è possibile utilizzare le espressioni regolari per facilitare il recupero dei dati in base ai valori di ricerca corrispondenti ai modelli.

Utilizzo dell'operatore $regex per la corrispondenza dei modelli

L'operatore $regex in MongoDB viene utilizzato per cercare stringhe specifiche nella collezione. L'esempio seguente mostra come ciò può essere fatto.

Supponiamo di avere la stessa collezione di dipendenti con i campi denominati "Employeeid" e "EmployeeName". Supponiamo inoltre di avere i seguenti documenti nella nostra collezione.

ID Dipendente Nome dipendente
22 Nuovo Martin
2 Mohan
3 Joe
4 Mohan R
100 Guru99
6 Gurang

Nel codice seguente abbiamo utilizzato l'operatore $regex per specificare i criteri di ricerca.

Utilizzando $regex Operator per la corrispondenza dei modelli

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

Code Spiegazione:

  1. Qui vogliamo trovare tutti i nomi dei dipendenti che contengono il carattere 'Gu'. Pertanto, specifichiamo l'operatore $regex per definire il criterio di ricerca 'Gu'.
  2. printjson viene utilizzato per stampare ogni documento restituito dalla query in un modo migliore.

Se il comando viene eseguito correttamente, verrà visualizzato il seguente output:

Produzione:

Utilizzando $regex Operator per la corrispondenza dei modelli

L'output mostra chiaramente che vengono restituiti i documenti in cui il nome del dipendente contiene i caratteri "Gu".

Supponiamo che la tua raccolta contenga i seguenti documenti con un documento aggiuntivo che contiene il nome del dipendente come "Guru999”. Se hai inserito i criteri di ricerca come “Guru99”, restituirebbe anche il documento che aveva “Guru999”. Ma supponiamo di non volerlo e di voler restituire solo il documento con “Guru99”. Quindi possiamo farlo con la corrispondenza esatta del modello. Per fare una corrispondenza esatta del modello, useremo i caratteri ^ e $. Aggiungeremo il carattere ^ all'inizio della stringa e $ alla fine della stringa.

ID Dipendente Nome dipendente
22 Nuovo Martin
2 Mohan
3 Joe
4 Mohan R
100 Guru99
6 Gurang
8 Guru999

L'esempio seguente mostra come farlo.

Utilizzando $regex Operator per la corrispondenza dei modelli

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

Code Spiegazione:

  1. Qui nei criteri di ricerca, stiamo usando i caratteri ^ e $. Il ^ viene utilizzato per assicurarsi che la stringa inizi con un determinato carattere e il $ viene utilizzato per assicurarsi che la stringa termini con un determinato carattere. Quindi quando il codice viene eseguito, estrarrà solo la stringa con il nome "Guru99 ".
  2. printjson viene utilizzato per stampare ogni documento restituito dalla query in un modo migliore.

Se il comando viene eseguito correttamente, verrà visualizzato il seguente output:

Produzione:

Utilizzando $regex Operator per la corrispondenza dei modelli

Nell'output è chiaramente visibile la stringa “Guru99” è stato recuperato.

Corrispondenza del modello con $ opzioni

Quando si utilizza l'operatore $regex è possibile fornire anche opzioni aggiuntive utilizzando $ options parola chiave. Ad esempio, supponiamo di voler trovare tutti i documenti che contengono "Gu" nel nome del dipendente, indipendentemente dal fatto che faccia distinzione tra maiuscole e minuscole o meno. Se si desidera un risultato del genere, è necessario utilizzare il file $ options con il parametro di insensibilità alle maiuscole/minuscole.

L'esempio seguente mostra come farlo.

Supponiamo di avere la stessa collezione di dipendenti con i campi denominati "Employeeid" e "EmployeeName".

Supponiamo inoltre di avere i seguenti documenti nella nostra collezione.

ID Dipendente Nome dipendente
22 Nuovo Martin
2 Mohan
3 Joe
4 Mohan R
100 Guru99
6 Gurang
7 GURU99

Ora, se eseguiamo la stessa query dell'argomento precedente, non vedremo mai il documento con "GURU99" nel risultato. Per assicurarci che venga incluso nel set di risultati, dobbiamo aggiungere il parametro "i" alla variabile $options.

Corrispondenza del modello con $ opzioni

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

Code Spiegazione:

  1. L'opzione $options con il parametro 'i' (che indica l'insensibilità alle maiuscole/minuscole) specifica che vogliamo eseguire la ricerca indipendentemente dal fatto che le lettere 'Gu' siano minuscole o maiuscole.

Se il comando viene eseguito correttamente, verrà visualizzato il seguente output:

Produzione:

Corrispondenza del modello con $ opzioni

  1. L'output mostra chiaramente che, anche se un documento contiene la lettera maiuscola 'Gu', viene comunque visualizzato nel set di risultati.

Corrispondenza di modelli senza l'operatore regex

È possibile effettuare la corrispondenza di pattern anche senza l'operatore $regex. L'esempio seguente mostra come fare.

Pattern Matching senza Regex Operator

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

Code Spiegazione:

  1. I delimitatori "//" servono fondamentalmente a specificare i criteri di ricerca all'interno di questi delimitatori. Pertanto, specifichiamo /Gu/ per trovare nuovamente i documenti che contengono "Gu" nel campo EmployeeName.

Se il comando viene eseguito correttamente, verrà visualizzato il seguente output:

Produzione:

Pattern Matching senza Regex Operator

L'output mostra chiaramente che vengono restituiti i documenti in cui il nome del dipendente contiene i caratteri "Gu".

Recupero degli ultimi 'n' documenti da una raccolta

Esistono vari modi per ottenere gli ultimi n documenti in una raccolta.

Analizziamo uno dei metodi attraverso i seguenti passaggi.

L'esempio seguente mostra come farlo.

Supponiamo di avere la stessa collezione di dipendenti con i campi denominati "Employeeid" e "EmployeeName".

Supponiamo inoltre di avere nella nostra collezione i seguenti documenti:

ID Dipendente Nome dipendente
22 Nuovo Martin
2 Mohan
3 Joe
4 Mohan R
100 Guru99
6 Gurang
7 GURU99

Recupero degli ultimi n documenti da una raccolta

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

Code Spiegazione:

  1. Quando si interrogano i documenti, utilizzare la funzione sort per ordinare i record in ordine inverso in base al valore del campo _id nella collezione. Il valore -1 indica sostanzialmente di ordinare i documenti in ordine inverso o decrescente, in modo che l'ultimo documento diventi il ​​primo a essere visualizzato.
  2. Quindi usa la clausola LIMIT per visualizzare solo il numero di record che desideri. Qui abbiamo impostato la clausola LIMIT (2), quindi verranno recuperati gli ultimi due documenti.

Se il comando viene eseguito correttamente, verrà visualizzato il seguente output:

Produzione:

Recupero degli ultimi n documenti da una raccolta

L'output mostra chiaramente che vengono visualizzati gli ultimi due documenti della raccolta. Quindi abbiamo chiaramente dimostrato che per recuperare gli ultimi "n" documenti nella raccolta, possiamo prima ordinare i documenti in ordine decrescente e quindi utilizzare la clausola limite per restituire il numero "n" di documenti richiesti.

Note:: Se la ricerca viene eseguita su una stringa che supera, diciamo, 38,000 caratteri, non verranno visualizzati i risultati corretti.

DOMANDE FREQUENTI

Anchor il modello con ^ e $. Il modello “^GuruSolo partite da 99$Guru99” e rifiuta “Guru999”, perché ^ lega l'inizio della stringa e $ lega la fine.

Solo i modelli che distinguono tra maiuscole e minuscole e che utilizzano il prefisso ^ sfruttano un indice in modo efficiente. I modelli non ancorati o che non distinguono tra maiuscole e minuscole attivano una scansione completa della collezione, quindi è consigliabile ancorare il prefisso ogni volta che è possibile.

I metacaratteri come punto, asterisco, segno più o parentesi quadre vanno anteposti a una barra rovesciata. Ad esempio, il formato per l'estensione letterale ".com" prevede l'escape del punto, quindi quest'ultimo non viene trattato come un carattere.

$regex esegue una corrispondenza di pattern flessibile su un singolo campo e può scansionare l'intera collezione. $text utilizza un indice di testo per una ricerca veloce basata su parole nei campi indicizzati, ma non supporta pattern di sottostringhe parziali.

Sì. Quando la stringa di ricerca supera circa 38,000 caratteri, la query potrebbe non restituire risultati corretti. Per una corrispondenza affidabile, è consigliabile mantenere i pattern e i campi di destinazione entro tale limite.

Memorizza una copia in minuscolo del campo per le ricerche senza distinzione tra maiuscole e minuscole, ancora i modelli con ^ e, per le raccolte di grandi dimensioni, preferisci un indice di testo o Atlas Search anziché le espressioni regolari non ancorate ($regex).

Gli assistenti basati sull'IA trasformano le regole in linguaggio naturale in modelli $regex, aggiungono gli ancoraggi e il flag $options corretti e avvisano quando una query attiverà una lenta scansione completa della raccolta.

Sì. Un copilota AI riscrive i modelli non ancorati, consiglia un indice di testo o una ricerca Atlas e converte le espressioni regolari ($regex) che non distinguono tra maiuscole e minuscole in una ricerca con campi in minuscolo per velocizzare il processo.

Riassumi questo post con: