En esta entrada aprenderás sobre MongoDB, una base de datos documental NoSQL muy popular en la actualidad. Será un pequeño tutorial en el que repasaremos sus características más importantes, sus ventajas y también analizaremos algunas alternativas comunes a esta base de datos.
Contenidos
¿Qué es MongoDB?
MongoDB es una base de datos NoSQL open source orientada a almacenar documentos en formato JSON en colecciones. Debido a su arquitectura, permite escalar el sistema para almacenar grandes cantidades de datos.
En esta base de datos el esquema de los datos no es fijo y es posible modificar y añadir las propiedades de los documentos. Esto hace que sea muy flexible al almacenar diferentes tipos de documentos en las colecciones.
Esta imagen nos muestra la gráfica de Google Trends con las búsquedas o popularidad de MongoDB y de Elasticsearch en el tiempo. Como vemos, tiene una gran popularidad en la actualidad y su uso se está extendiendo. MongoDB forma parte de los stacks populares en desarrollo web como MEAN, MERN o MEVN.
Las bases de datos en MongoDB almacenan colecciones, que son agrupaciones de documentos (las colecciones son equivalentes a las tablas en un modelo relacional). Cada documento puede ser único e independiente, con su propia estructura y campos. A cada documento se le asigna un identificador único en la colección llamado «_id». Los documentos a su vez contienen campos, que serían equivalentes a las columnas en un modelo relacional.
A continuación, un ejemplo de documento sencillo:
{
Nombre: Oscar,
Ciudad: Madrid,
Edad: 25
}
Arquitectura y Componentes
Como sabemos, MongoDB es una base de datos fácilmente escalable. Se pueden tener clusters de cientos de nodos con millones de documentos almacenados.
Además incorpora una utilidad de consola que usa lenguaje JavaScript. También, podemos usar alguna de las herramientas de gestión o clientes MongoDB GUI con interfaz gráfica para aumentar la productividad como MongoDB Compass.
MongoDB Atlas
MongoDB Atlas es el servicio cloud que proporciona esta base de datos gestionada en diferentes proveedores cloud, como AWS, Azure o Google Cloud (GCP). Incluye mecanismos de automatización y simplifica la gestión de la escalabilidad y seguridad de los datos.
Se trata de una solución multicloud, con la posibilidad de desplegar entre diferentes servicios y regiones para aumentar la disponibilidad de los datos. Podríamos compararla con soluciones como CosmosDB o Amazon DocumentDB.
En MongoDB Atlas también tenemos la posibilidad de crear índices textuales para hacer búsquedas de texto en nuestras colecciones. Este componente usa Lucene embebido como hace Elasticsearch.
Puede acceder a datos del data lake en formato Parquet o Avro de manera federada con MongoDB Compass. También puede hacer merge de datos almacenados en almacenamientos externo, por ejemplo combinando datos en S3 y en Mongo.
Además, Atlas hace recomendaciones del tipo de índices (simples y compuestos) que crear en función de las consultas. Para ello usa las mediciones y las métricas del rendimiento a nivel de shard, de nodo, de máquina y los tipos de consulta.
En cuanto al backup, es posible definir políticas de backup con sus periodos de retención y establecer la frecuencia de los backups incrementales.
Ventajas de MongoDB
En esta sección, veremos algunas de las razones por las que usar esta base de datos NoSQL:
- Orientación a Documentos. La capacidad de almacenar directamente documentos en formato JSON convierte a MongoDB en una base de datos muy flexible y que reduce el tiempo de implementación de nuestras aplicaciones.
- MongoDB usa expresiones regulares para hacer las consultas, que son más potentes y flexibles que el lenguaje SQL. Además, existen numerosos drivers para lenguajes de programación como PyMongo para Python, Jongo para Java, mgo para Go o Mongoose para Node.js.
- Alta disponibilidad. MongoDB puede implementar replicación de los datos, manteniendo copias en varios nodos, que permiten mantener una alta disponibilidad y tolerancia a errores.
- Escalabilidad. Al repartir los datos en múltiples nodos con el mecanismo de sharding en replica sets, el sistema puede escalar horizontalmente y balancear la carga en varios servidores. Mediante una capa intermedia que actúa de proxy (Mongos) se dividen los datos en entornos de réplica. Se puede particionar mediante hash de manera equitativa o por campos.
Ejemplos y Comandos Útiles
Para desplegar Mongo en nuestro sistema, podemos usar Docker. El repositorio docker hub nos proporciona imágenes oficiales con todo lo que necesitaremos. También, puedes descargarlo de forma gratuita de la web oficial para tu sistema operativo o, en el caso de usar Linux, puedes usar el gestor de paquetes para instalarlo directamente:
sudo apt install mongodb
Para interactuar con la base de datos usaremos su shell en la terminal, llamada Mongoshell. Podemos ejecutarla con el comando mongosh. El primer paso es definir una base de datos y una colección. Para crear o usar una base de datos en particular, usaremos el comando:
> use nombre_bd
switched to db nombre_db
Ahora, podemos listar todas las bases de datos con el comando
show dbs
Para mostrar las colecciones:
show collections o show tables
Para crear una colección nos basta con insertar un documento. Si la colección no existe, creará una nueva con ese nombre de forma automática. Por ejemplo, tomando el documento que definimos arriba, podemos insertarlo en una colección de la siguiente forma:
> db.Usuario.insert
(
{
"Nombre": "Oscar",
"Ciudad": "Madrid",
"Edad": 25
}
)
WriteResult({ "nInserted" : 1 })
Para hacer una consulta, podemos pedir que nos devuelva todos los documentos que existen en una colección. Por ejemplo:
> db.Usuario.find({})
> db.Usuario.find({Nombre : "Oscar"}).foreach(printjson);
Cuando obtenemos varios valores de respuesta, podemos ordenarlos con el método sort() especificando como argumento el valor a ordenar e indicando un 1 para orden ascendente y un -1 para orden descendente, por ejemplo:
> db.Usuario.find().sort({Nombre: 1});
También, podemos usar los siguientes operadores para realizar consultas más complejas:
- gt: mayor que
- lt: menor que
- gte and lte: mayor o igual que y menor o igual que
- eq: igual
- ne: no igual
- or: o
- exists: existe
- in: el valor se encuentra en
- nin: el valor no se encuentra en
> db.Usuario.find({Nombre: {$in: ['Oscar', 'Óscar']}});
Replicación
Los Replica Sets en MongoDB con conjuntos de nodos de un clúster que contienen los mismos datos replicados.
En cada Replica Set solo hay un nodo primario, el resto de nodos son secundarios, y contiene de 2 a 50 copias de los datos. Las lecturas y las escrituras de datos se realizan en el nodo primario. Aunque no está recomendado, también se puede configurar para permitir las lecturas de datos sobre nodos secundarios.
La replicación nos permite tener capacidades de alta disponibilidad, recuperación de desastres y mejorar las operaciones de mantenimiento.
Además, nos permite aislar las cargas de trabajo y soportar aplicaciones operacionales (transaccionales) y analíticas en el mismo clúster. De esta forma, parte de los nodos secundarios en modo solo lectura se podrían destinar a operaciones analíticas.
Si el nodo primario pierde la conectividad o no se encuentra disponible, se elige un nodo secundario para que actúe a partir de ese momento como nodo primario.
El mecanismo de replicación de MongoDB es capaz de autogestionar los fallos, con failover en menos de 5 segundos y con reintentos de lecturas y escrituras para gestionar excepciones temporales.
Alternativas a MongoDB
Tanto MongoDB como MySQL o PostgreSQL son bases de datos con un buen rendimiento. Debemos comprender sus diferencias para poder elegir la más adecuada en nuestro caso. MySQL y PostgreSQL son bases de datos relacionales (RDBMS) que nos permiten almacenar los datos en tablas y establecer relaciones para consultarlos con el lenguaje SQL.
La ventaja de MongoDB sobre estas bases de datos son las menores limitaciones en cuanto a esquemas y estructuras predefinidas para almacenar los datos. Según como modelemos los datos podemos emular la mayoría de tipos de bases de datos. Editar un esquema en MySQL o PostgreSQL es mucho más complejo que en una base de datos documental. Por otro lado, las bases de datos relacionales como MySQL son superiores en consistencia de los datos, transacciones y seguridad.
Bases de datos Relacionales | MongoDB |
---|---|
Bases de datos | Bases de datos |
Tablas | Colecciones |
Filas | Documentos |
Columnas | Campos |
Joins | Documentos embebidos |
Índice | Índice |
Entre las alternativas NoSQL que podríamos evaluar se encuentran las siguientes opciones:
- Elasticsearch
- Couchbase
- CouchDB
- DynamoDB
- Apache Cassandra
- ArangoDB
- CockroachDB
Cursos de MongoDB y Formación
Aquí, puedes encontrar enlaces a los que, en mi opinión, son los mejores cursos para aprender MongoDB y empezar a usar esta potente base de datos NoSQL en tus proyectos:
Curso de Introducción a MongoDB
Este curso oficial proporcionado por MongoDB disponible en Coursera te enseñará a usar MongoDB desde cero. Incluye más de 17 horas de formación, incluyendo conceptos NoSQL para que aproveches todo su potencial para analítica de datos. También, trabajarás con MongoDB Atlas y herramientas de línea de comandos.
Gestión avanzada de datos con MongoDB
Este curso avanzado de MongoDB te dará los conocimientos necesarios sobre mejora del rendimiento, gestión de índices y diseño.
Preguntas Frecuentes MongoDB – FAQ
¿Qué es MongoDB?
MongoDB es una base de datos NoSQL documental open source que proporciona alta escalabilidad y alta disponibilidad para almacenar documentos.
¿Qué es el sharding en MongoDB?
El sharding consiste en repartir los datos almacenados en diferentes hosts o nodos. De esta forma, el sistema puede escalar horizontalmente añadiendo nuevos nodos al clúster aumentando la capacidad de almacenamiento. Cada partición de los datos se denomina un shard.
¿Qué es un Namespace en MongoDB?
Un namespace es la concatenación del nombre de la colección con el nombre de la base de datos en la que se almacena un documento.
¿Qué es un Replica Set en MongoDB?
Un replica set es un conjunto de nodos en un clúster de MongoDB que alojan los mismos datos replicados. Uno de estos nodos se denomina primario y es el que sirve los datos. El resto de nodos con el dataset se denominan secundarios.
A continuación, el vídeo-resumen. ¡No te lo pierdas!