MongoDB - Espressione regolare

Le espressioni regolari vengono spesso utilizzate in tutte le lingue per cercare un modello o una parola in qualsiasi stringa. MongoDB fornisce anche funzionalità di espressione regolare per la corrispondenza del modello di stringa utilizzando il$regexoperatore. MongoDB utilizza PCRE (Perl Compatible Regular Expression) come linguaggio di espressioni regolari.

A differenza della ricerca di testo, non è necessario eseguire alcuna configurazione o comando per utilizzare le espressioni regolari.

Supponiamo di aver inserito un documento in un database denominato posts come mostrato di seguito -

> db.posts.insert(
{
   "post_text": "enjoy the mongodb articles on tutorialspoint",
   "tags": [
      "mongodb",
      "tutorialspoint"
   ]
}
WriteResult({ "nInserted" : 1 })

Utilizzo dell'espressione regex

La seguente query regex cerca tutti i post contenenti string tutorialspoint in esso -

> db.posts.find({post_text:{$regex:"tutorialspoint"}}).pretty()
{
	"_id" : ObjectId("5dd7ce28f1dd4583e7103fe0"),
	"post_text" : "enjoy the mongodb articles on tutorialspoint",
	"tags" : [
		"mongodb",
		"tutorialspoint"
	]
}
{
	"_id" : ObjectId("5dd7d111f1dd4583e7103fe2"),
	"post_text" : "enjoy the mongodb articles on tutorialspoint",
	"tags" : [
		"mongodb",
		"tutorialspoint"
	]
}
>

La stessa query può essere scritta anche come:

>db.posts.find({post_text:/tutorialspoint/})

Utilizzo dell'espressione regex con case insensitive

Per rendere insensibile alle maiuscole / minuscole di ricerca, utilizziamo $options parametro con valore $i. Il comando seguente cercherà le stringhe con la parolatutorialspoint, indipendentemente dal caso più piccolo o maiuscolo -

>db.posts.find({post_text:{$regex:"tutorialspoint",$options:"$i"}})

Uno dei risultati restituiti da questa query è il seguente documento che contiene la parola tutorialspoint in diversi casi -

{
   "_id" : ObjectId("53493d37d852429c10000004"),
   "post_text" : "hey! this is my post on TutorialsPoint", 
   "tags" : [ "tutorialspoint" ]
}

Utilizzo di regex per elementi array

Possiamo anche usare il concetto di regex sul campo array. Ciò è particolarmente importante quando implementiamo la funzionalità dei tag. Quindi, se vuoi cercare tutti i post con tag che iniziano dalla parola tutorial (tutorial o tutorial o tutorialpoint o tutorialphp), puoi utilizzare il seguente codice:

>db.posts.find({tags:{$regex:"tutorial"}})

Ottimizzazione delle query di espressioni regolari

  • Se i campi del documento sono indexed, la query utilizzerà valori indicizzati per corrispondere all'espressione regolare. Questo rende la ricerca molto veloce rispetto all'espressione regolare che scansiona l'intera collezione.

  • Se l'espressione regolare è un file prefix expression, tutte le corrispondenze devono iniziare con una determinata stringa di caratteri. Ad esempio, se l'espressione regex è^tut, quindi la query deve cercare solo le stringhe che iniziano con tut.