MongoDB

MongoDB es una base de datos NoSQL orientada a documentos diseñada para gestionar grandes volúmenes de datos no estructurados de manera eficiente. Desde su lanzamiento en 2009, se ha convertido en una de las bases de datos más populares debido a su flexibilidad, escalabilidad y capacidad para trabajar con datos que no se ajustan al modelo relacional tradicional.

En lugar de utilizar tablas y filas como en las bases de datos relacionales, MongoDB organiza los datos en colecciones y documentos. Los documentos están formateados en JSON o BSON, lo que permite una representación flexible de la información. Esta estructura facilita el almacenamiento y la recuperación de datos complejos y heterogéneos.

A diferencia de las bases de datos relacionales, MongoDB no impone un esquema rígido. Esto significa que los desarrolladores pueden almacenar datos con formatos variados dentro de la misma colección, adaptándose fácilmente a aplicaciones que evolucionan rápidamente o que necesitan manejar datos dinámicos y en constante cambio. Esto lo convierte en una opción ideal para proyectos modernos que demandan agilidad y escalabilidad.

Estructura

En MongoDB, los datos se organizan en una estructura jerárquica que consta de bases de datos, colecciones y documentos:

  • Bases de datos: Una base de datos en MongoDB es el nivel más alto de organización. Dentro de una base de datos, se pueden crear múltiples colecciones para diferentes conjuntos de datos relacionados.
  • Colecciones: Una colección es el equivalente a una tabla en las bases de datos relacionales. Contiene múltiples documentos que comparten un propósito común, aunque no tienen que tener el mismo esquema.
  • Documentos: Los documentos son las unidades fundamentales de datos en MongoDB. Se almacenan en formato BSON (Binary JSON) y suelen representarse como objetos JSON. Cada documento es una estructura flexible que puede incluir diferentes campos y tipos de datos.

Tipos de datos

MongoDB admite una amplia variedad de tipos de datos para representar información compleja y diversa. Algunos de los tipos más comunes incluyen:

  1. Cadenas de texto
    • String: Almacena texto en formato UTF-8, ideal para nombres, descripciones, y otros campos de texto.
  2. Números
    • Integer: Almacena números enteros de varios tamaños según la implementación.
    • Double: Almacena números con punto flotante, útiles para datos como precios o mediciones.
  3. Fechas
    • Date: Almacena datos de tiempo con soporte para operaciones avanzadas.
  4. Booleanos
    • Boolean: Representa valores de verdadero o falso.
  5. Datos binarios
    • BinData: Almacena datos binarios como imágenes o archivos comprimidos.

Características principales

Modelo de datos flexible: MongoDB permite crear documentos con estructuras personalizadas, lo que facilita manejar datos complejos y cambiar su esquema sin afectar a otros documentos.

Escalabilidad horizontal: MongoDB se diseñó con la escalabilidad en mente. Utiliza particionamiento de datos (sharding) para distribuir documentos en múltiples servidores, lo que permite manejar cantidades masivas de información.

Consultas avanzadas: MongoDB soporta consultas complejas y operaciones de agregación que permiten analizar datos y obtener resultados sofisticados sin necesidad de transformar los datos previamente.

Alta disponibilidad: Con la configuración de réplicas, MongoDB asegura que los datos estén disponibles incluso en caso de fallos del sistema.

Consultas

Consultas CRUD (Create, Read, Update, Delete)

Estas operaciones están relacionadas con la manipulación de los datos dentro de las colecciones. Los comandos CRUD permiten crear, leer, actualizar y eliminar documentos.

  • INSERT
  • El comando INSERT permite agregar nuevos documentos a una colección:

    Este comando inserta un nuevo documento en la colección empleados. El documento contiene los campos nombre, apellido, salario y departamento, con valores específicos para un empleado. En términos generales, esta operación agrega un nuevo registro a la colección de empleados en la base de datos.

  • FIND
  • El comando FIND permite recuperar documentos de una colección:

    Esta consulta encuentra todos los documentos en la colección empleados donde el salario es mayor a 5000. La operación extrae todos los documentos que cumplen con el criterio especificado, mostrando la información de esos empleados.

  • UPDATE
  • El comando UPDATE permite modificar documentos existentes en una colección:

    Este comando actualiza el documento del empleado con nombre 'Carlos' en la colección empleados, estableciendo un nuevo salario de 5500. La operación modifica solo el salario del documento que cumple con el criterio de búsqueda.

  • DELETE
  • El comando DELETE permite eliminar documentos de una colección:

    Este comando elimina el documento del empleado con nombre 'Carlos' de la colección empleados. La operación borra por completo el documento que cumple con el criterio de búsqueda.

Consultas de agregación

MongoDB también ofrece una poderosa función de agregación que permite realizar operaciones complejas en los datos, como filtrado, clasificación y agrupación.

  • AGGREGATE
  • El comando AGGREGATE permite realizar operaciones avanzadas de agregación:

    Esta operación utiliza el comando aggregate para filtrar primero los empleados del departamento 'Finanzas' y luego calcular el salario promedio de ese departamento. La operación de agregación es útil para obtener resúmenes y métricas de los datos almacenados.

Consultas de definición de colecciones

MongoDB permite definir colecciones dentro de la base de datos, lo que permite estructurar los datos y las operaciones sobre ellos.

  • CREATE
  • MongoDB no requiere un comando específico para crear colecciones, ya que las colecciones se crean automáticamente al insertar el primer documento en ellas. Sin embargo, puedes crear una colección explícitamente usando:

    Este comando crea explícitamente una colección llamada 'empleados'. En MongoDB, las colecciones son flexibles y no requieren una definición rígida, como en SQL, por lo que la estructura de los documentos puede variar.

  • DROP
  • El comando DROP elimina una colección de la base de datos:

    Este comando elimina la colección empleados de la base de datos. Todos los documentos almacenados en esa colección se perderán, y la colección dejará de existir.

Consultas de control de acceso

MongoDB permite definir roles y permisos para controlar el acceso a las bases de datos y las colecciones.

  • GRANT
  • El comando GRANT otorga permisos a los usuarios:

    Este comando otorga el rol 'readWrite' en la base de datos 'empresa' al usuario 'usuario1'. Esto le permitirá al usuario leer y escribir documentos en esa base de datos.

  • REVOKE
  • El comando REVOKE revoca permisos previamente otorgados a los usuarios:

    Este comando revoca el rol 'readWrite' en la base de datos 'empresa' para el usuario 'usuario1'. Después de esta operación, el usuario ya no podrá realizar operaciones de lectura y escritura en esa base de datos.

Funciones y Operadores

En MongoDB, las funciones y operadores permiten realizar transformaciones y cálculos en los datos, así como filtrar, ordenar o modificar documentos de manera eficiente. Similar a SQL, las funciones en MongoDB pueden clasificarse en dos tipos principales: funciones de agregación y funciones escalares. Estas son útiles para el análisis, transformación y manipulación de datos dentro de las consultas.

Funciones de Agregación

Las funciones de agregación en MongoDB operan sobre conjuntos de datos y devuelven un único valor o conjunto procesado. Se utilizan dentro de una operación de agregación como el pipeline de agregación.

  • $sum: Suma los valores de un campo numérico.
  • $avg: Calcula el promedio de los valores de un campo.
  • $count: Cuenta el número de documentos en una agrupación.
  • $min y $max: Encuentran el valor mínimo o máximo dentro de un conjunto de valores.
Operadores Lógicos en MongoDB

En MongoDB, los operadores lógicos son fundamentales para construir consultas avanzadas y filtrar documentos según condiciones específicas. Estos operadores permiten combinar múltiples criterios y realizar evaluaciones complejas dentro de una consulta.

  • $and: Evalúa múltiples expresiones y devuelve los documentos que cumplen con todas las condiciones especificadas. Es útil para filtrar documentos que deben cumplir varios criterios simultáneamente.
  • $or: Devuelve los documentos que cumplen al menos una de las condiciones especificadas. Es ideal para búsquedas donde cualquier de los criterios sea suficiente.
  • $nor: Devuelve los documentos que no cumplen ninguna de las condiciones especificadas. Es la combinación lógica de "not" y "or".
  • $not: Invierte la condición de un operador y devuelve los documentos que no cumplen el criterio especificado. Generalmente se utiliza dentro de expresiones de comparación.
  • $expr: Permite usar expresiones de agregación para realizar operaciones lógicas directamente en la consulta.

Estas funciones se utilizan dentro de la etapa $group del pipeline de agregación para realizar cálculos sobre los datos agrupados.

Funciones Escalares

A diferencia de las funciones de agregación, las funciones escalares operan sobre un único documento o fila. Se aplican a cada documento individualmente y retornan un valor basado en los datos de ese documento.

  • $toLower y $toUpper: Convierte cadenas de texto a minúsculas o mayúsculas.
  • $concat: Une dos o más cadenas de texto en una sola.
  • $substr: Extrae una parte de una cadena de texto.
  • $round: Redondea un número a un número específico de decimales.
  • $currentDate: Devuelve la fecha y hora actual del sistema.

Estas funciones son útiles para la manipulación y el formateo de los datos dentro de la consulta.

Operadores

MongoDB también ofrece una variedad de operadores que se utilizan en las consultas para realizar comparaciones y cálculos. Algunos de los operadores más comunes incluyen:

  • $eq: Equivalente al operador de igualdad (=) en SQL.
  • $ne: Distinto a (!=) en SQL.
  • $gt: Mayor que (>) en SQL.
  • $lt: Menor que (<) en SQL.
  • $gte: Mayor o igual que (>=) en SQL.
  • $lte: Menor o igual que (<=) en SQL.
Operadores aritméticos
  • $add: Suma dos o más valores.
  • $subtract: Resta un valor de otro.
  • $multiply: Multiplica dos o más valores.
  • $divide: Divide un valor entre otro.
  • + , - , * , /: Operadores aritméticos para sumar, restar, multiplicar y dividir.

Consultas Avanzadas

  • $distinct
  • El operador $distinct se utiliza para devolver valores únicos de un campo en una colección. Por ejemplo:

    Esta consulta recupera todos los departamentos únicos de la colección de empleados. Si dos o más empleados pertenecen al mismo departamento, este solo se mostrará una vez.

  • $currentDate
  • El operador $currentDate establece el valor de un campo como la fecha y hora actual. Por ejemplo:

    Actualiza el campo ultimaActualizacion con la fecha y hora actual.

  • $inc
  • El operador $inc incrementa un valor numérico de un campo. Por ejemplo:

    Aumenta el saldo de la cuenta en 100 unidades.

  • $rename
  • El operador $rename cambia el nombre de un campo dentro de un documento. Por ejemplo:

    Cambia el nombre del campo direccion a direccionPostal.

  • $set
  • El operador $set establece un valor para un campo específico. Si el campo no existe, lo crea. Por ejemplo:

    Establece el valor del campo categoria a 'electronica'.

  • $unset
  • El operador $unset elimina un campo de un documento. Por ejemplo:

    Elimina el campo descuento del documento.

  • $addToSet
  • El operador $addToSet agrega un valor a un conjunto (array) si no está presente. Es ideal para agregar valores a un array sin duplicados. Por ejemplo:
  • $addToSet con $each
  • El operador $addToSet también puede usarse con $each para agregar múltiples valores a un array. Por ejemplo:

    Esta consulta agrega "lectura", "cine" y "viajes" al array de intereses de "Maria", evitando duplicados.

    Agrega el valor 'deportes' al array intereses si no existe ya.

  • $pop
  • El operador $pop elimina el primer o último elemento de un array. Por ejemplo:

    Elimina el último elemento del array intereses.

  • $pull
  • El operador $pull elimina los elementos de un array que coinciden con una condición. Por ejemplo:

    Elimina todos los elementos en el array intereses que sean 'futbol'.

  • $push
  • El operador $push agrega un valor al final de un array. Por ejemplo:

    Agrega el valor 'videojuegos' al final del array intereses.

  • $unionWith
  • $unionWith combina los resultados de dos colecciones diferentes. Por ejemplo:

    Esta consulta devuelve todos los empleados, combinando la colección de empleados con la colección de ex empleados.

  • $group
  • El operador $group agrupa documentos por una o más claves y aplica una función de agregación. Por ejemplo:

    Agrupa a los empleados por departamento y cuenta cuántos empleados hay en cada uno.

  • $match
  • $match filtra los documentos de acuerdo con una condición. Por ejemplo:

    Devuelve todos los empleados cuya edad es mayor a 30.

  • $regex
  • El operador $regex se utiliza para buscar un patrón en un campo. Por ejemplo:

    Esta consulta obtiene los empleados cuyos nombres comienzan con la letra "A". El símbolo ^ es un ancla que representa el inicio de la cadena.

  • $regex
  • El operador $regex permite realizar búsquedas de patrones complejos dentro de campos de texto utilizando expresiones regulares. Un ejemplo avanzado sería:

    Este ejemplo busca artículos cuyo nombre no contenga las palabras 'fácil' ni 'rápido', usando una expresión regular avanzada con lookahead negativo.

  • $in
  • El operador $in permite especificar múltiples valores en una condición. Por ejemplo:

    Esta consulta obtiene los empleados que trabajan en los departamentos de Ventas o Marketing.

  • $nin
  • El operador $nin permite especificar múltiples valores en una condición. Por ejemplo:

    Esta consulta obtiene los empleados que no trabajan en los departamentos de Ventas o Marketing.

  • $or
  • El operador $or se utiliza para realizar una consulta con varias condiciones. Por ejemplo:

    Esta consulta devuelve los empleados que tienen menos de 30 años o un salario superior a 50,000.

  • $subtract
  • El operador $subtract se utiliza para restar valores. Por ejemplo, una triple resta:

    Esta consulta calcula la ganancia restando los costos, impuestos y descuentos de los ingresos.

  • $divide
  • El operador $divide se utiliza para dividir valores. Por ejemplo:

    Esta consulta calcula el promedio de ventas por cliente.

  • $text
  • El operador $text permite realizar búsquedas de texto completo en campos indexados. Por ejemplo:

    Busca artículos que contengan la palabra "tecnología" en campos indexados como titulo o contenido.

  • $where
  • El operador $where permite evaluar una expresión JavaScript dentro de una consulta. Por ejemplo:

    Encuentra productos cuyo precio sea mayor a 100, evaluando la condición en JavaScript.

  • $group
  • El operador $group se utiliza para agrupar documentos en una consulta de agregación. Por ejemplo:

    Esta consulta agrupa las ventas por vendedor, calcula el total y el promedio de ventas, y lista los productos vendidos por cada vendedor.

Estos operadores son solo una pequeña muestra de las capacidades que ofrece MongoDB para trabajar con datos. MongoDB permite crear consultas avanzadas y realizar análisis detallados de manera eficiente.

  • $aggregate
  • La función $aggregate se utiliza para realizar operaciones avanzadas en MongoDB. Este ejemplo combina $match, $group y operadores como $sum, $avg y $push:

    Icono C:\Windows\system32\cmd.exe
    db.ventas.aggregate([
    { $match: { fecha: { $gte: ISODate('2023-01-01'), $lt: ISODate('2024-01-01') } } },
    { $group: {
        _id: '$vendedor',
        total_ventas: { $sum: '$monto' },
        promedio_ventas: { $avg: '$monto' },
        productos_vendidos: { $push: '$producto' }
    } },
    { $sort: { total_ventas: -1 } }
    ]);

    Esta consulta filtra las ventas del año 2023, agrupa por vendedor, calcula el total y el promedio de ventas, y lista los productos vendidos por cada vendedor. Finalmente, ordena los resultados por el total de ventas en orden descendente.

  • Relaciones en MongoDB
  • MongoDB es una base de datos NoSQL que no utiliza tablas ni relaciones entre ellas, por lo que no tiene un concepto directo de "JOIN" como en SQL. Sin embargo, MongoDB ofrece una operación similar llamada $lookup, que permite hacer uniones entre colecciones.

    Icono C:\Windows\system32\cmd.exe
    db.empleados.aggregate([
    {
        $lookup: {
            from: "departamentos",
            localField: "depto_id",
            foreignField: "id",
            as: "departamento_info"
        }
    }
    ]);

    En esta consulta, $lookup se usa para unir los documentos de la colección empleados con los documentos de la colección departamentos. La operación compara el campo depto_id de la colección empleados con el campo id de la colección departamentos. Los resultados se almacenan en un nuevo campo llamado departamento_info dentro de cada documento de la colección empleados.

  • $lookup en MongoDB
  • $lookup es el operador que permite realizar una especie de "join" entre colecciones en MongoDB. Si bien no es exactamente igual a un JOIN en SQL, permite combinar datos de diferentes colecciones en una sola consulta de agregación.

    Icono C:\Windows\system32\cmd.exe
    db.empleados.aggregate([
    {
        $lookup: {
            from: "departamentos",
            localField: "depto_id",
            foreignField: "id",
            as: "departamento_info"
        }
    },
    { 
    $unwind: "$departamento_info" 
    },
    { 
    $project: { "nombre": 1, "departamento_info.nombre": 1 } 
    }
    ]);

    Este ejemplo utiliza $unwind para desestructurar el array resultante del $lookup, a fin de trabajar con los campos de la colección unida de manera más sencilla. Luego, el operador $project permite seleccionar solo las columnas que queremos que aparezcan en el resultado, en este caso, el nombre del empleado y el nombre del departamento.

  • Operadores de Agregación en MongoDB
  • MongoDB ofrece varios operadores de agregación como $match, $group, $sort, entre otros, que permiten realizar consultas complejas y manejar grandes volúmenes de datos de manera eficiente.

    Icono C:\Windows\system32\cmd.exe
    db.empleados.aggregate([
    { 
    $match: { salario: { $gt: 50000 } } 
    },
    { $lookup: {
        from: "departamentos",
        localField: "depto_id",
        foreignField: "id",
        as: "departamento_info"
        } 
    },
    { 
    $unwind: "$departamento_info" 
    },
    { 
    $project: { "nombre": 1, "departamento_info.nombre": 1 } 
    }
    ]);

    En este ejemplo, usamos $match para filtrar a los empleados que ganan más de 50,000 antes de hacer el $lookup. Esto mejora la eficiencia al reducir los documentos que se procesan en el $lookup y hace la consulta más rápida.

Instalación y Conexión a MongoDB

MongoDB es una base de datos NoSQL muy popular, especialmente utilizada en aplicaciones web modernas debido a su capacidad para manejar grandes volúmenes de datos no estructurados. En este tutorial, veremos cómo instalar MongoDB en tu máquina y cómo conectarte a ella usando la herramienta de línea de comandos de MongoDB.

Para instalar MongoDB en tu máquina, sigue los pasos según el sistema operativo que estés utilizando:

Descarga el instalador desde el sitio web oficial de MongoDB. Sigue las instrucciones del instalador para completar la instalación.

Para iniciar el servicio de MongoDB en Linux, puedes usar el siguiente comando:

Descarga la shell desde el sitio web oficial de MongoDB.

Una vez que MongoDB esté instalado, puedes conectarte a él usando mongosh, una shell interactiva que reemplaza a la antigua mongo. Esta shell es más moderna y soporta nuevas funcionalidades para interactuar con la base de datos de manera eficiente.

Una vez que MongoDB esté instalado, puedes conectarte a él usando la herramienta de línea de comandos de MongoDB, llamada mongosh. Para iniciar la sesión en el shell de MongoDB, simplemente ejecuta:

Una vez conectado a MongoDB, puedes empezar a interactuar con tus bases de datos y colecciones. Si deseas salir de la shell de mongosh, simplemente escribe exit y presiona Enter.

Por defecto, MongoDB se conecta al puerto 27017. Este es el puerto predeterminado en el que MongoDB escucha para las conexiones entrantes. Si estás ejecutando MongoDB localmente, no necesitas especificar el puerto, ya que mongosh se conecta automáticamente al localhost en el puerto 27017.

Sin embargo, si tu servidor de MongoDB está corriendo en una dirección o puerto diferente, puedes especificar la URL de conexión en el siguiente formato:
Comandos Básicos en mongosh

Al estar dentro de la shell de mongosh, puedes ejecutar comandos para interactuar con la base de datos. Algunos de los comandos más comunes son:

  • show dbs: Muestra todas las bases de datos disponibles en tu servidor MongoDB.
  • use <nombre-db>: Cambia a una base de datos específica.
  • show collections: Muestra las colecciones dentro de la base de datos seleccionada.
  • db.<nombre-coleccion>.find(): Muestra todos los documentos en una colección específica.

Introducción a Mongoose

Mongoose es una biblioteca de JavaScript que facilita la interacción con MongoDB desde aplicaciones Node.js. Mongoose proporciona una solución basada en esquemas para trabajar con colecciones de datos, permitiendo un modelado más estructurado y controlado de los documentos.

Para usar Mongoose, primero necesitas instalarlo en tu proyecto de Node.js. Puedes hacerlo usando npm:

Una vez que Mongoose esté instalado, puedes usarlo para conectarte a tu base de datos MongoDB. Aquí tienes un ejemplo de cómo establecer una conexión:

const mongoose = require('mongoose'); // Conexión a MongoDB mongoose.connect('mongodb://localhost:27017/miBaseDeDatos', { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => console.log('Conectado a MongoDB')) .catch((error) => console.error('Error de conexión:', error));

Este código establece una conexión a una base de datos MongoDB en el servidor local (localhost) y usa el puerto 27017 por defecto. Si la conexión es exitosa, se imprime el mensaje 'Conectado a MongoDB'. En caso de error, se muestra el mensaje de error en la consola.

Creando un Modelo con Mongoose

Una de las características principales de Mongoose es su sistema de modelos. Los modelos en Mongoose definen cómo se deben estructurar los documentos dentro de una colección de MongoDB. Aquí hay un ejemplo de cómo definir un modelo para un documento de empleado:

const mongoose = require('mongoose'); // Definición del esquema para un empleado const empleadoSchema = new mongoose.Schema({ nombre: { type: String, required: true }, edad: { type: Number, required: true }, departamento: { type: String, required: true } }); // Creación del modelo basado en el esquema const Empleado = mongoose.model('Empleado', empleadoSchema); // Crear un nuevo empleado const nuevoEmpleado = new Empleado({ nombre: 'Carlos', edad: 30, departamento: 'Ventas' }); nuevoEmpleado.save() .then(() => console.log('Empleado guardado')) .catch((error) => console.error('Error al guardar:', error));

En este ejemplo, primero definimos un esquema para el modelo 'Empleado', indicando los campos 'nombre', 'edad' y 'departamento'. Luego, creamos un nuevo documento con este esquema y lo guardamos en la base de datos MongoDB.

Recursos

Si deseas profundizar más en MongoDB y Mongoose, puedes revisar la documentación oficial: