Introducción a MongoDB. Ejemplos de consultas en documentos.

En este proyecto se crearán y definirán consultas en MOngoDb a una hipotética base de datos para una app de mensajería instantánea. Se proporcionarán las sentencias para el shell de MongoDB y los resultados que se obtienen en cada uno de los apartados.

Qué cubre esta guía de MongoDB

El artículo funciona como un cuaderno práctico de consultas MongoDB. Cada ejemplo parte de un requisito concreto, muestra la sentencia del shell y explica por qué operadores como $gt, $lt, $elemMatch, $regex o aggregate resultan útiles cuando los datos se guardan como documentos anidados en lugar de tablas relacionales.

Si estás comparando bases documentales con otros modelos NoSQL, esta página se entiende mejor junto con conceptos básicos y modelos NoSQL y la guía actualizada sobre qué es MongoDB y cuándo tiene sentido usarlo.

Encontrar en la collection Usuarios_Individuales los usuarios que proceden de Madrid y que tienen una edad entre 20 y 40 años sin incluir aquellos que tengan 20 o 40. Mostrarlos ordenados descendentemente por edad, listando solo su email y su edad.

La consulta realizada es la siguiente:

Con el siguiente resultado

Lo más interesante de esta consulta, es la utilización de $gt: 20 y $lt:40. Estas dos etiquetas nos permiten encontrar aquellos usuarios que tengan una edad entre 20 y 40 años sin incluir aquellos que tengan 20 o 40.

Listar el nombre de los usuarios bloqueadores de la collection Bloqueos que han creado un bloqueo entre las 9:25 y las 10.

La consulta tiene una dificultad añadida con respecto la anterior. En este caso vamos a buscar en un subdocumento, por lo tanto, es necesario utilizar $elemMatch para obtener el resultado deseado.

Los resultados con la comprobación de la hora.
Sin la comprobación:

Encontrar cuantos documentos de la collection Grupos_usuarios tienen:

  • Identificador (G-nnnn) que termina en un número par, o sea nnnn es par,
  • Id_propietario (U-mmmm) que termina en un número par, o sea mmmm es par

En esta consulta utilizaré $regex para saber si es o no es un número par.

Los resultados han sido:

El resultado del segundo comando es: 11

Listar Nombre y Apellidos de los usuarios en la collection Usuarios_desbloqueadores que han creado al menos un desbloqueo en el mes de Octubre, entre las 10 y las 15 horas (15 incluidas)

Los resultados han sido:

Siguiendo las peticiones del enunciado, obtengo:

Para la collection Grupos_usuarios, encontrar las ciudades que tienen más de 15 miembros con más de 35 años. Listar las ciudades encontradas por número descendente de miembros.

En este caso he utilizado aggregate para resolver el requerimiento. De esta forma he agrupado la información y seleccionado aquella que me ha interesado. Para seleccionar los subdocumentos deseados he utilizado la etiqueta $match y para agrupar $group.

Conclusión

Estos ejemplos muestran por qué MongoDB encaja bien cuando la aplicación trabaja de forma natural con documentos que contienen campos anidados, arrays y estructuras variables. Los filtros simples son legibles, pero la parte importante es aprender cuándo usar operadores de arrays y etapas de agregación para que la consulta respete la forma real del documento almacenado.

En un sistema de producción, el siguiente paso sería revisar índices, frecuencia esperada de cada consulta y crecimiento de los documentos. Una consulta clara en un conjunto de aprendizaje puede necesitar un índice compuesto o un diseño documental distinto cuando la colección crece.