MongoDB Espressioni regolari (Regex) con esempi
Le espressioni regolari vengono utilizzate per la corrispondenza dei modelli, che รจ fondamentalmente per 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
Migliori 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 raccolta Employee che ha i nomi Field di "Employeeid" e "EmployeeName". Supponiamo inoltre di avere i seguenti documenti nella nostra raccolta.
| ID Dipendente | Nome dipendente |
|---|---|
| 22 | Nuovo Martin |
| 2 | Mohan |
| 3 | Joe |
| 4 | Mohan R |
| 100 | Guru99 |
| 6 | Gurang |
Qui nel codice seguente abbiamo utilizzato l'operatore regex per specificare i criteri di ricerca.
db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)
Code Spiegazione:
- Qui vogliamo trovare tutti i nomi dei dipendenti che contengono i caratteri "Gu". Pertanto, specifichiamo l'operatore $regex per definire i criteri di ricerca di 'Gu'
- 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:
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 il documento solo 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.
db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)
Code Spiegazione:
- 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 ".
- 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:
Nell'output รจ chiaramente visibile la stringa โGuru99โ รจ stato recuperato.
Corrispondenza del modello con $ opzioni
Quando si utilizza l'operatore regex รจ anche possibile fornire opzioni aggiuntive utilizzando l' $ 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.
L'esempio seguente mostra come farlo.
Supponiamo di avere la stessa raccolta Employee con i nomi dei campi "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'ultimo argomento, non vedremmo mai il documento con "GURU99" nel risultato. Per garantire che questo venga incluso nel set di risultati, dobbiamo aggiungere il parametro $opzioni "I".
db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)
Code Spiegazione:
- Le opzioni $ con il parametro 'I' (che significa distinzione tra maiuscole e minuscole) specificano che vogliamo effettuare la ricerca non importa se troviamo le lettere 'Gu' in minuscolo o maiuscolo.
Se il comando viene eseguito correttamente, verrร visualizzato il seguente output:
Produzione:
- L'output mostra chiaramente che anche se un documento ha la lettera maiuscola "Gu", il documento viene comunque visualizzato nel set di risultati.
Corrispondenza di modelli senza l'operatore regex
Si puรฒ anche fare il pattern matching senza l'operatore regex. Il seguente esempio mostra come si puรฒ fare.
db.Employee.find({EmployeeName: /Gu/'}).forEach(printjson)
Code Spiegazione:
- Le opzioni "//" significano fondamentalmente specificare i criteri di ricerca all'interno di questi delimitatori. Pertanto, stiamo specificando /Gu/ per trovare nuovamente i documenti che hanno "Gu" nel loro EmployeeName.
Se il comando viene eseguito correttamente, verrร visualizzato il seguente output:
Produzione:
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.
Diamo un'occhiata a uno dei modi attraverso i seguenti passaggi
L'esempio seguente mostra come farlo.
Supponiamo di avere la stessa raccolta Employee con i nomi dei campi "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 |
db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)
Code Spiegazione:
1) Quando si eseguono query sui documenti, utilizzare la funzione di ordinamento per ordinare i record in ordine inverso in base al valore del campo _id nella raccolta. Il -1 indica fondamentalmente di ordinare i documenti in ordine inverso o discendente in modo che l'ultimo documento diventi il โโprimo documento ad essere visualizzato.
2) Quindi utilizzare la clausola limite per visualizzare solo il numero di record desiderati. Qui abbiamo impostato la clausola limite (2), quindi recupererร gli ultimi due documenti.
Se il comando viene eseguito correttamente, verrร visualizzato il seguente output:
Produzione:
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.
Sintesi
- La corrispondenza dei modelli puรฒ essere ottenuta dall'operatore $regex. Questo operatore puรฒ essere utilizzato per trovare determinate stringhe nella raccolta.
- I simboli ^ e $ possono essere utilizzati per ricerche di testo esatte con ^ utilizzato per assicurarsi che la stringa inizi con un determinato carattere e $ utilizzato per garantire che la stringa termini con un determinato carattere.
- La "i" insieme all'operatore $regex puรฒ essere utilizzata per specificare l'insensibilitร alle maiuscole in modo che le stringhe possano essere cercate sia che siano in minuscolo che in maiuscolo.
- I delimitatori // possono essere utilizzati anche per la corrispondenza dei modelli.
- Utilizza una combinazione di sort e la funzione limit per restituire gli ultimi n documenti nella raccolta. La funzione di ordinamento puรฒ essere utilizzata per restituire i documenti in ordine decrescente, dopodichรฉ รจ possibile utilizzare la clausola limite per limitare il numero di documenti restituiti.










