Aprende a utilizar mongodb en node js como un PRO

Las bases de datos relacionales son para pussies. Muerte a MySQL y que vivan las bases de datos NoSQL. Si las grandes tecnológicas dieron el salto en su día por algo será y hoy vamos a aprender a utilizar MongoDB en Node JS!!

Jajajaja realmente la afirmación anterior no es tan tajante, no te vayas a pensar que las bases de datos relacionales han muerto para dar paso a este nuevo tipo de concepción. Eso es falso y si hay algún recruitmen de consultora que te lo dice huye rápido de su despacho.

Estos dos tipos de bases de datos están pensadas para solucionar problemas diferentes. Ya hice un artículo en el que hablaba de las diferencias entre MySQL y MongoDB y que puedes leer aquí así que échale un vistazo antes de utilizar MongoDB en Node JS 😉

Cómo instalar MongoDB en nuestra máquina

El primer paso como es lógico será instalar MongoDB en nuestra máquina. No quiero entrar mucho en detalle porque en la página de la comunidad de mongodbspain esta muy bien explicado así que me voy a limitar a dejar los enlaces:

Una vez lo tengas instalado hay un punto clave que tienes que tener en cuenta.

Para utilizar MongoDB en tu máquina es necesario que el demonio esté ejecutándose. Obviamente al igual que con otras bases de datos pero con MongoDB lo tienes que levantar tu mismo.

En la documentación de mongodbspain está profundamente ampliado pero quédate con los siguientes comandos:

$ mongod --config /usr/local/etc/mongod.conf

Este comando ejecuta el demonio y si le añades el flag –fork harás que mongo corra en segundo plano.

$ mongod --config /usr/local/etc/mongod.conf --fork

Si quieres hacer que mongo se ejecute de manera automática cuando enciendes el ordenador lanza los siguientes comandos.

//Iniciar el proceso principal mongod de MongoDB al iniciar sesión:
$ ln -sfv /usr/local/opt/mongodb/*.plist ~/Library/LaunchAgents
 
//Iniciar MongoDB ahora en background y dejarlo en ejecución
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist

Bien, con esto anterior ya habrás configurado esta base de datos no relacional y orientada a objetos en tu máquina. Ahora viene lo divertido y vamos a ver como utilizar MongoDB en Node JS.

Cómo utilizar MongoDB en Node JS

El primer paso para utilizar mongodb en node js es crearnos una base de datos, para ello abrimos una terminal y escribimos mongo. Esto nos conectará con el sistema de base de datos.

A diferencia con MySQL en la que para crear una nueva base de datos teníamos que pelearnos con los CREATE TABLE y definir una estructura con MongoDB eso no pasa.

Una vez conectados tenemos que indicar que queremos usar una base de datos e insertar un registro para que el sistema la construya on-the-fly. Sigue los pasos 😉

$ mongo
> use base-de-datos-de-prueba
> db.albums.insert({id: 1, band: 'Las Bistecs', album:'Oferta'});

Con esto ya habremos creado la base de datos y habremos insertado un nuevo registro en la colección de albums.

Vale ya tenemos lo básico pero… ¿cómo hacemos para conectar MongoDB con Node JS?

Pues eso lo vamos a hacer utilizando Mongoose que es un ORM.

Para el que no conozca qué son y cómo funcionan los ORM le dejo este enlace de la Wikipedia.

Conectar MongoDB a Node JS mediante Mongoose

Para ello vamos a instalar Mongoose tirando del gestor de dependencias NPM. Así pues en la terminal escribimos lo siguiente:

$ npm install mongoose --save

Ya sabéis, el flag –save para que guarde una copia en el directorio node_modules y actualice el package.json.

Una vez se haya instalado deberías tener el entrypoint de tu aplicación node parecido al que voy a poner a continuación. (En el post anterior expliqué cómo organizar un proyecto con node js y qué es eso del entrypoint, échale un vistazo desde aquí)

  • Línea número 3: incluímos el módulo mongoose para poder utilizarlo dentro de nuestra aplicación.
  • Línea número 8: hacemos uso del método connect. Este método acepta dos argumentos. El primero es la cadena de conexión a dónde tenemos que conectarnos y el segundo es la función callback. Fíjate en la cadena de conexión. Lo primero que hay que indicar es el protocolo (mongodb en este caso), después el nombre del host donde esté la base de datos (localhost, nuestra máquina local en este caso), después el puerto por defecto de MongoDB (27017 en este caso) y por último la base de datos a la que queremos conectarnos (base-de-datos-de-prueba en este caso)
  • Línea número 9: comprobamos si ha habido algún error de conexión y en caso contrario levantamos el servidor node

Y ya está, eso es todo.

Con esto ya podrás utilizar MongoDB en Node JS, es lo mínimo en cuanto a configuración se refiere. En el próximo artículo veremos cómo hacer las operaciones típicas de lectura, escritura, actualización y borrado sobre nuestro proyecto.

Y ya sabéis, si tenéis algún tipo de dudas o preguntas hacédmelas llegar en la sección de comentarios o a través del siguiente banner de Twitter.

[xyz-ips snippet=”FAQS-GORKAMU-TW-YELLOW”]

Hala a cascarla!

#2 Batalla de gallos: MongoDB vs MySQL

Seguimos con una nueva batalla, en este caso MongoDB vs MySQL. Vamos a ver que motor de persistencia es mejor y de entre las características de ambos cual ganará esta batalla de gallos.

Las bases de datos relacionales han sido el pilar de un montón de aplicaciones empresariales durante mucho tiempo y mas desde que se lanzó MySQL en 1995, esta ha sido la opción mas popular.

Ahora, sin embargo con la explosión de la minería de datos y el trabajo con grandes volúmenes de estos ha provocado que tecnologías en el campo de bases de datos no-relaciones hayan aparecido en el juego como requisito para el nuevo tipo de aplicaciones.

Así pues, bases de datos no-relaciones como MongoDB se utiliza para este tipo de aplicaciones, aumentando o reemplazando la infraestructura típica relacional.

¿Qué es MySQL?

MySQL es un Sistema de Gestión de Base de Datos (SGDB) Open-Source basado en entidades y relaciones. Si alguien no sabe que es el Open-Source no es nada mas y nada mas que código abierto, distribuido y desarrollado libremente. Cualquiera puede leer, utilizar y contribuir al código fuente de una aplicación Open-Source.

Pues bien, pese a ser software Open-Source, MySQL es mantenido y distribuido por Oracle pero si te apetece ver el código fuente de MySQL puedes forkearte algún repositorio de todos los que tienen en su cuenta de GitHub y echar un vistazo.

Tal y como hacen otros sistema de gestión de bases de datos, MySQL almacena los datos en tablas y estructuras utilizando un lenguaje específico para relacionarse y comunicarse con esos datos guardados. Este lenguaje se llama SQL (Structured Query Language). Como no es nada nuevo no voy a contar como utilizar SQL  sino que voy a dejar este tutorial de la W3SCHOOLS por si alguien viene de nuevas y si quiere conocer  además en qué se basa SQL, cual es el trasfondo técnico de cómo funciona, te diré que se trata del álgebra relacional, aquí tienes un paper introductorio sobre el cálculo y el álgebra relacional.

En diferentes trabajos (técnicos) que he tenido, he visto utilizar SQL no solo a informáticos sino también a gente de contabilidad y finanzas incluso al personal de marketing así que no es una mala idea que tengas unos mínimos conocimientos por si trabajas de forma directa o indirecta con ordenadores y volúmenes de datos.

En MySQL se definen tanto la estructura de la base de datos como las relaciones entre las diferentes entidades que van a existir según tus requerimientos dentro de un universo concreto de datos.

Si te cuesta visualizar la afirmación anterior o no la entiendes lo vas a ver muy claro con el siguiente ejemplo. Yo no sé si serás usuario de Netflix o no pero te voy a contar como funciona. La cuenta mas avanzada (y cara) del servicio de televisión bajo demanda permite mediante un único registro, un único email y una única cuenta bancaria o cuenta de Paypal ser utilizado hasta por cuatro personas diferentes.

Cuatro personas que van a acceder a la plataforma con sus propios dispositivos y que van a necesitar una cuenta de usuario para poder entrar. Si nos planteamos guardar este conjunto de datos podríamos hacerlo tal que así de una manera muy muy muy simplificada y sin tener en cuenta otras entidades y relaciones.

Relación de ejemplo en una base de datos relacionales como MySQL
Relación de ejemplo en una base de datos relacionales como MySQL

Como vemos aquí, tenemos la tabla de Usuario en la que almacenaremos datos relacionados sobre los usuarios, ¿lógico no? Un identificador que será un número único, el nombre de usuario, su email y su contraseña. Por otro lado tenemos la tabla Dispositivo en la que también tenemos un identificador, el tipo de dispositivo, su modelo y una referencia al usuario al que pertenece.

Tenemos así una relación, una relación 1:N en este caso, me explico.

Supongamos que el Rey de España es un viciado de las series y en un momento dado se hace una cuenta en Netflix. Al poco tiempo su mujer, la Infanta Cristina y Urdangarin se enteran y le solicitan un acceso a Felipe.

El Rey se conecta a la plataforma mediante su Mac Air, su mujer con un iPad, la infanta lo hace mediante su smartphone y Urdangarin desde una Smart TV. Así pues el conjunto de datos quedaría tal que así:

Vemos que el identificador de Usuario en la tabla Dispositivo es de 1 relacionándose así con el identificador de Usuario en la tabla Usuario. Con esto tenemos que la cuenta elRey se conecta a Netflix usando un Mac Air, un iPad, un Android y una LG.

Esto es lo que conocemos como bases de datos relacionales.

Aquí te dejo un curso completísimo sobre SQL de la Universidad de Standford.

¿Qué es MongoDB?

MongoDB es una base de datos Open-Source desarrollada por los chicos de MongoDB… y que se guía bajo el concepto de base de datos no relacionales. A diferencia de las bases de datos relacionales que exigían definir estructuras de datos fijas y estáticas que acababan tomando forma de tabla, en las bases de datos no relacionales los datos se guardan en forma de documentos en los que la estructura puede variar.

Así pues en uno de estos documentos podemos guardar  la información de la cuenta de Netflix del Rey junto a sus 4 dispositivos, pero además también podemos meter un conjunto de series y películas que le gusta a cada uno de los 4 dispositivos diferentes.

Y todo eso en un solo objeto.

Este tipo de almacenamiento junto a su forma de acceder y explotar los datos lo conocemos como NoSQL y es super rápido debido a que no tiene que ir a otras tablas a buscar información adicional para darnos una visión parcial o total de un universo de datos sino que cuando consultamos algo, todo lo referente a eso ya lo tenemos.

MongoDB utiliza esquemas de datos dinámicos, lo que significa que se pueden crear registros sin definir la estructura, tales como los campos o los tipos de datos de sus valores. Se puede cambiar la estructura de los documentos simplemente añadiendo nuevos campos o borrando los que ya tenemos.

https://gist.github.com/gorkamu/3305fd3e9977b1eabf2b95becc1b8d20.js

Los documentos no necesitan tener un conjunto idéntico de datos y la desnormalización es el pan de cada día de este tipo de bases de datos. MongoDB se diseñó para tener una alta disponibilidad y una gran escalabilidad por lo que su crecimiento horizontal es mas fácil y barato para los sistemas.

Así pues para consultar la información sobre el Rey de España lo haríamos tal que así:

db.Clientes.find({Nombre:"elRey"});

Accedemos a los datos utilizando JSON para hacer las consultas. Aquí tienes el link a la universidad de MongoDB para aprender mas como funciona este tipo de base de datos no relacional.

Terminología y Conceptos

Con esta tabla vas a ver como muchos conceptos de MySQL tiene su analogía con objetos de MongoDB. Estos son los conceptos típicos de cada sistema.

MySQL MongoDB
Tablas Colecciones
Registros Documentos
Columnas Campos
Joins Documentos embebidos o lincados

 

Comparativa de funcionalidades. MongoDB vs MySQL

Al igual que MySQL, MongoDB ofrece un rico conjunto de características y funcionalidades mucho mas allá de los ofrecidos en simples conjuntos de key-value.  Algunas de las cosas que puede hacer son las consultas Ad Hoc, indexar, hacer balanceo de carga o replicarse.

En la siguiente tabla se pueden ver las funcionalidades de MySQL enfrentadas a las de MongoDB.

MySQL MongoDB
Modelos de datos enriquecidos No Si
Esquemas dinámicos No Si
Datos tipados Si Si
Localidad de los datos No Si
Actualización de campos Si Si
Facilidad para los programadores No Si
Transacciones complejas Si No
Administración y auditoría Si Si
Distribución dinámica de datos No Si

 

Lenguaje de consultas

Ambos sistemas tienen un conjunto diferente de estructuras de lenguaje para poder consultar los datos. En la documentación de MongoDB y en la de MySQL encontraras amplia información para manejarte con estas bases de datos pero para muestra un botón (que asco le he tenido siempre a esta expresión)

Consultas típicas de MySQL

https://gist.github.com/gorkamu/35f6c2da75b6a4d1b286d10da79ca0d3.js

Consultas típicas de MongoDB

https://gist.github.com/gorkamu/4ea507a826703ba144703503523a2094.js

MongoDB vs MySQL: update queries performance
MongoDB vs MySQL: update queries performance

¿Cuándo utilizar MongoDB en lugar de MySQL?

Empresas de diferente tamaño y número de trabajadores están empezando a utilizar este tipo de bases de datos ya que les permite desarrollar aplicaciones mas rápido, manejar datos de muy diferente tipo y administrar aplicaciones de manera mas eficiente a escala.

Al utilizar bases de datos no relacionales como MongoDB eliminas la capa ORM, sistema de mapeo objeto-relacional, que se encarga de convertir los datos guardados en tablas en objetos dentro del código fuente, en Java los POJOs y en PHP los POPOs.

La estructura flexible de una base de datos no relacional significa que el conjunto y tipo de datos pueden crecer y evolucionar sin que afecte a los requerimientos de la capa de negocio.

También, las bases de datos NoSQL se pueden escalar de una manera relativamente sencilla y sin tiempo de inactividad a través de diferentes centros de datos distribuidos, proporcionando nuevos niveles de disponibilidad y accesibilidad en comparación con las bases de datos relacionales.

¿Cuando es mejor opción utilizar una base de datos relacional?

Aunque la mayoría de las aplicaciones modernas requieren un sistema flexible y escalable como MongoDB, hay casos de uso para el que una base de datos relacional sería mas adecuado.

Las aplicaciones que requieren complejas transacciones de datos como el sistema de un banco, en el fondo utilizan bases de datos relacionales, al igual que se dice sobre el COBOL…

Las bases de datos no relacionales no son un sustituto de las bases de datos relacionales, son un complemento que podemos utilizar para diseñar un sistema de respuesta ágil utilizando además Varnish como sistema avanzado de cache.

Volviendo con el ejemplo del banco, podríamos tener una primera capa que manejara datos a través de NoSQL  y que fuera la encargada de interactuar con el usuario y las distintas APIs y una segunda capa utilizando SQL y que se encargase de almacenar los datos bancarios cuando los usuarios hiciesen transferencias.

Entonces… ¿MySQL y MongoDB se pueden utilizar juntos?

Pues como he contado arriba con el ejemplo del banco, si. Pero existen muchísimos ejemplos de desarrollo híbrido. En la gran mayoría de casos se trata mas de saber cual es la herramienta concreta para tus necesidades.

Por ejemplo, muchas de las herramientas de ecommerce utilizan una mezcla de ambas tecnologías. Mostrar un catálogo dinámico de productos que tienen diferentes atributos es un buen ejemplo para usar la flexibilidad en la estructura y en los datos que nos aportan las bases de datos no relacionales.

Por otro lado, el sistema de pago del ecommerce, es probable que utilice bases de datos relacionales como motor de persistencia debido a las operaciones complejas que pueden darse en la lógica de negocio y debido al sistema de transacciones que nos brinda MySQL.

En otros casos, nuevos requisitos en la lógica de negocio empujan a las organizaciones a adoptar tecnologías basadas en MongoDB de cara a la próxima generación de sus aplicaciones internas.

Así pues, con estos ejemplos, es bastante normal pensar que MongoDB es mejor que MySQL debido a su modelo de datos flexible y su arquitectura escalable pero todo es cuestión de valorar las mejores herramientas que se adapten a tus requisitos y no adaptar una solución tan solo porque esta de moda.

 

Y con esto se acabó la segunda batalla de gallos de tecnologías. Deja un comentario o ponme un tweet a través del siguiente banner con las tecnologías que quieres que enfrente en la próxima batalla 😉

[xyz-ips snippet=”FAQS-GORKAMU-TW-YELLOW”]

Hala a mamarla!