Skip to main content
Implementar JOINs en mongoDB

¿Cómo implementar JOINs en MongoDB?

1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (Ninguna valoración todavía)
Cargando…

La idea de que los sistemas de procesamiento de datos tradicionales (o SQL) y los NoSQL son opuestos e incompatibles, es la gran discusión que se plantea a día de hoy. Sin embargo, al igual que pasa con el resto de tecnologías, se pueden utilizar sin problemas de forma simultánea. Si en tu caso,  el modelo de datos cambia rápidamente y se necesita un alto rendimiento y escalabilidad, es probable que lo que mejor aplique sean soluciones NoSQL. Pero, si por otro lado, la estructura de los datos no suele cambiar con normalidad y el crecimiento de los datos es “moderado”, puede que las tecnologías SQL sean la mejor opción. Obviamente, todas estas decisiones nos abren un nuevo mundo aún por explotar e investigar ya que nunca ha existido (y menos a día de hoy) una única forma de enfocar y solucionar el mismo problema.

mongodb_bigdata_02
App Man Adventures – www.appdynamics.com

Entre todos los sistemas de procesamiento NoSQL que están surgiendo y cogiendo mucha fuerza actualmente, destacaremos en esta entrada MongoDB.  MongoDB no es más que una DBMS orientada a documentos, es decir, su modelo de datos está basado en objetos JSON en lugar de en tablas como en los RDBMS tradicionales, y por lo tanto, MongoDB no soporta ni JOINs ni transacciones.

¿Problemas? Piensa en positivo y busca el símil conceptual

Hay veces que por necesidades que escapan a nuestro control, hemos definido un modelo de datos sobre el cual estamos forzados a realizar JOINs de información entre diferentes collections de MongoDB. Es en ese momento cuando, en función de la cantidad de consultas que se requieran realizar, pueden quedar patentes las debilidades del modelo de datos definido y posiblemente haya que revisarlo.

Una vez revisado que el modelo de datos es correcto y que las consultas que tenemos que realizar mediante JOINs de información son inevitables, pasamos a enfrentarnos a cómo hacerlo. Para ello tendríamos que ser capaces de visualizar conceptualmente lo que queremos conseguir, para lo que nos centraremos en algo que a los que habéis trabajado con sistemas SQL os resultará familiar: las vistas.

 

mongodb_bigdata_03Si incluimos dentro del nivel conceptual todas las collections de nuestro modelo de datos en MongoDB, nuestra “vista” sería una collection resultante de realizar el JOIN de las collections de las que queremos mezclar la información.

Manos a la obra

Todo esto conceptualmente queda muy bien pero, ¿cómo conseguirlo? Es en este momento cuando utilizaremos el Map-Reduce que proporciona MongoDB.

mongodb_bigdata_04Con el Map-Reduce podremos realizar un mapeo en nuestro modelo de datos de nuestra “vista” con la información de las otras dos collections. A continuación os añado un pequeño ejemplo para que sea más didáctico.

mongodb_bigdata_05 mongodb_bigdata_06

Consideraciones finales

Como se puede observar, esta nueva collection contiene un JOIN de los datos que nos interesan de las otras dos collections lo cual nos plantea una consideración que no se debe pasar por alto: es otra collection. Sí, así es, es una collection nueva sin “propiedades mágicas”, es decir, cada vez que la consultemos tendrá la última “foto” que se ha creado al ejecutar el Map-Reduce, por lo que si se ha actualizado alguna de las otras dos collections del modelo de datos, no se refrescará en la collection que hemos considerado nuestra “vista”.

Por este motivo este tipo de consultas que requieren JOINs de collections deberían ser las mínimas dentro de las consultas realizadas por la lógica de negocio del aplicativo ya que de no ser así, el rendimiento puede verse comprometido, saliendo más a cuento revisar el modelo de datos original.

Y con esto concluyo esperando que os haya aportado algo de luz sobre este tipo de problemática con MongoDB y pueda serviros de guía para problemas futuros. Recordad que cada problema es un mundo y en la imaginación está el límite, así que usadla con moderación.

 

 

 

Elías Grande Rubio

Arquitecto SOA/BPM y Consultor de Seguridad TIC pragmático e investigador. Apasionado de la seguridad, las tecnologías middleware y de la computación de altas prestaciones. Diseñador de ideas revolucionarias que me hubieran hecho rico… pero las guardé en Megaupload y ahora escribo blogs.

Elías Grande Rubio ha escrito 7 entradas


Elías Grande Rubio

Arquitecto SOA/BPM y Consultor de Seguridad TIC pragmático e investigador. Apasionado de la seguridad, las tecnologías middleware y de la computación de altas prestaciones. Diseñador de ideas revolucionarias que me hubieran hecho rico… pero las guardé en Megaupload y ahora escribo blogs.

2 comentarios en “¿Cómo implementar JOINs en MongoDB?

  1. Como estas ?
    Muy bueno el articulo.

    Ahora, viendo esto, si venís del palo SQL, tiene que ser para un uso muy particular mongoDB, si no, en vez de beneficio, te metes un un problema serio verdad ?

    Cuando hacer vistas y store procedure con inner join y muchas cosas mas, es muy sencillo.

    Yo estoy haciendo pruebas con mongoDB ahora, para guardar la configuración de una aplicación, y se me acaba de presentar el primer problema de armar un join.

    La otra forma es, levantar todo al cliente como 2 colecciones distintas, y hacer algo ahí !!!

    Saludos
    Eduardo

    1. Bajo mi punto de vista, antes de elegir una base de datos NoSQL, independientemente de que esté de moda o no, hay que estudiar claramente el caso de uso concreto para el que se quiere utilizar.

      La versatilidad de los modelos NoSQL nos permitiría definir un modelo de datos suficientemente útil como para evitar joins entre colecciones (nomenclatura MongoDB). Al fin y al cabo, es NoSQL, no hay que cumplir ninguna forma normal de base de datos relacionales 😉

      Para el caso que planteas, si quieres guardar configuración de tu aplicación y necesitas realizar joins, posiblemente te convenga revisar tu modelo de datos para fusionar ambas colecciones en una. Ten en cuenta que MongoDB, aunque haya añadido a partir de la versión 3.2 la opción de “$lookup (aggregation)” [https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/] para el join de colecciones (en versiones anteriores la opción propuesta en este artículo seguiría siendo válida), no está pensado principalmente para dicho tipo de operaciones.

      Saludos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *