Expresiones regulares en MongoDB

Tutorial de MongoDB con JavaEn este artículo, el cuarto, de la serie CRUD en MongoDB (Create, Read, Update, Delete) se va a ver una introducción a las expresiones regulares en MongoDB. Una expresión regular, a menudo llamada también patrón, es una expresión que describe un conjunto de cadenas sin enumerar sus elementos especificando una serie operadores que pueden variar según el lenguaje de programación que se use aunque la mayoría de sus sintaxis son comunes.

MongoDB, como buena base de datos NoSQL, soporta expresiones regulares y patrones gracias a la librería lipcre de PERL. Para realizar búsquedas mediante una expresión regular se usa el operador $regex y, como es obvio, se debe usar el mismo estilo de expresiones regulares que para PERL.

Expresiones regulares en MongoDB

Para entender y explicar el uso de patrones de búsqueda en MongoDB se van a ver algunos ejemplos básicos para mostrar su uso de forma global.

Primero, vamos a buscar todas las claves “name” que contengan la letra “a”:

> db.people.find({ name: { $regex: "a" } })
{ "_id" : ObjectId("513cb9b3cd61c58d37e33e7e"), "name" : "Jose David" }
{ "_id" : ObjectId("513cb9c0cd61c58d37e33e81"), "name" : "Charlie" }
{ "_id" : ObjectId("513cb9c8cd61c58d37e33e82"), "name" : "Dave" }

Para especificar la expresión regular se ha usado el operador $regex al que se le indica el patrón de las cadenas de caracteres que se deben dar como válidas o coincidentes. Como se puede apreciar, el documento con la clave “name” igual a “Alice” no aparece ya que las expresiones regulares distinguen entre mayúsculas y minúsculas (case sensitive).

Ahora, se van a buscar los que terminen con el carácter “e”. Para ello se debe indicar el carácter deseado, “e” en este caso, seguido del símbolo “$” que indica el final de cadena:

> db.people.find({ name: { $regex: "e$" } })
{ "_id" : ObjectId("513cb9b7cd61c58d37e33e7f"), "name" : "Alice" }
{ "_id" : ObjectId("513cb9c0cd61c58d37e33e81"), "name" : "Charlie" }
{ "_id" : ObjectId("513cb9c8cd61c58d37e33e82"), "name" : "Dave" }
{ "_id" : ObjectId("513cb9decd61c58d37e33e84"), "name" : "George" }

En artículos posteriores entraremos en más detalle sobre el uso de expresiones regulares y sobre cómo afecta al rendimiento de las consultas. Su uso, de forma general, es bastante menos óptimo que el uso de comparaciones por rangos, por ejemplo. Sin embargo, una expresión regular con bastantes restricciones y bien definida puede ser mucho más eficiente. Este es el caso de la búsqueda de valores que comiencen por un determinado carácter, ya que muchos documentos serían excluidos de forma casi inmediata y sin tener que realizar más comprobaciones adicionales.

Un ejemplo de esto sería buscar los campos clave “name” que empiecen por “A”, usando el símbolo “^” al comienzo del patrón para indicar esta opción:

> db.people.find({ name: { $regex: "^A" } })
{ "_id" : ObjectId("513cb9b7cd61c58d37e33e7f"), "name" : "Alice" }

Para ver una búsqueda más compleja, se va a realizar una consulta para encontrar los documentos con “name” que empiecen por “A” o que posean la clave “age”:

> db.people.find({ $or: [ {name: { $regex: "^A"}}, { age: { $exists: true }} ] })
{ "_id" : ObjectId("513cb9b7cd61c58d37e33e7f"), "name" : "Alice" }
{ "_id" : ObjectId("513cbe46cd61c58d37e33e87"), "name" : "Smith", "age" : 35 }
{ "_id" : ObjectId("513cbe53cd61c58d37e33e88"), "name" : "Peter", "age" : 18 }

Conclusión

Aunque este artículo se ha visto una mera introducción, sin entrar en detalle, sobre las expresiones regulares en sí ya que la finalidad era mostrar cómo se pueden realizar consultas en MongoDB haciendo uso de patrones. En artículos posteriores del tutorial de MongoDB con Java se irán mostrando expresiones regulares más complejas según sea necesario.

Happy Minds!!!

Share on FacebookTweet about this on TwitterShare on LinkedInShare on RedditShare on Google+Digg thisShare on TumblrPin on PinterestBuffer this pagePrint this pageEmail this to someone