Introducción a MongoDB
MongoDB es un sistema de base de datos NoSQL desarrollado en C++, diseñado sobre una arquitectura de almacenamiento de archivos distribuidos. Su propósito principal es ofrecer a las aplicaciones web modernas una solución de almacenamiento de datos altamente escalable y de gran rendimiento.
Características Principales
Ventajas
- Almacenamiento orientado a documentos: Facilita el guardado de estructuras de datos complejas y objetos directamente.
- Consultas dinámicas e indexación: Permite búsquedas flexibles y mantiene un rendimiento excepcional incluso con volúmenes masivos de información.
- Formato BSON: Utiliza una representación binaria de JSON, optimizada para la velocidad de escaneo y procesamiento.
- Manejo de archivos grandes: Incluye GridFS para almacenar y recuperar eficientemente objetos binarios extensos, como imágenes o videos.
- Procesamiento agregado: Soporta operaciones complejas mediante MapReduce y el framework de agregación.
- Ecosistema de drivers: Ofrece soporte nativo para múltiples lenguajes de programación, incluyendo Java, Python, C#, PHP, Ruby y C++.
Desventajas
- Transacciones: Históricamente carece del soporte robusto para transacciones complejas de múltiples documentos que ofrecen las bases de datos relacionales tradicionales (aunque versiones recientes han introducido mejoras en este aspecto).
- Consumo de almacenamiento: La preasignación de espacio, la repetición de nombres de campos en cada documento y la no liberación inmediata de espacio tras eliminaciones pueden incrementar el uso de disco.
- Herramientas de administración: No cuenta con un ecosistema de herramientas de mantenimiento y administración tan maduro y estandarizado como el de MySQL.
- Flexibilidad del esquema: La ausencia de un esquema rígido puede derivar en inconsistencias de datos si no se aplican validaciones adecuadas a nivel de aplicación.
Conceptos de Arquitectura
Para comprender MongoDB, es útil comparar sus componentes con los de una base de datos relacional como MySQL:
- Database (Base de datos): Contenedor físico para las colecciones.
- Collection (Colección): Equivalente a una tabla. Agrupa documentos.
- Document (Documento): Equivalente a una fila. Es la unidad básica de datos en formato BSON.
- Field (Campo): Equivalente a una columna. Representa los pares clave-valor dentro de un documento.
- Index (Índice): Estructuras de datos que mejoran la velocidad de las operaciones de consulta.
- Primary Key (Clave primaria): MongoDB asigna automáticamante un campo
_idúnico como identificador principal de cada documento.
Tipos de Datos Fundamentales
- String: Cadenas de texto UTF-8.
- Boolean: Valores verdaderos (
true) o falsos (false). - Array: Listas ordenadas de valores o documentos.
- ObjectId: Identificador único de 12 bytes generado por defecto para los documentos.
- Null: Representación de un valor vacío o inexistente.
- Code: Código JavaScript serializado.
Operaciones con Documentos
Inserción de Datos
Para insertar un único documento, se utiliza el método insertOne. Para inserciones masivas, se emplea insertMany, permitiendo controlar el orden de escritura:
db.empleados.insertMany(
[
{ nombre: "Carlos", departamento: "Ventas", salario: 45000 },
{ nombre: "Elena", departamento: "TI", salario: 60000 }
],
{ ordered: false }
);
Actualización de Documentos
Las actualizaciones pueden ser reemplazos completos o modificaciones parciales. En las versiones modernas de MongoDB, se recomienda usar updateOne o updateMany en lugar del parámetro multi.
Reemplazo completo:
db.empleados.updateOne(
{ nombre: "Carlos" },
{ nombre: "Carlos", departamento: "Gerencia", salario: 75000 }
);
Modificación parcial con $set:
db.empleados.updateMany(
{ departamento: "TI" },
{ $set: { ubicacion: "Remoto" } }
);
Incremento de valores con $inc:
db.empleados.updateOne(
{ nombre: "Elena" },
{ $inc: { salario: 5000 } }
);
Eliminación de Documentos
Para borrar registros, se utilizan los métodos deleteOne o deleteMany, reemplazando al antiguo método remove:
db.empleados.deleteOne(
{ nombre: "Carlos" }
);
db.empleados.deleteMany(
{ departamento: "Ventas" }
);
Consultas y Filtrado
La recuperación de datos se realiza principalmente con find() y findOne(). El método pretty() (en shells antiguos) o la salida formateada por defecto en mongosh ayuda a la legibilidad.
Operadores de comparación y expresiones regulares:
- Comparación:
$gt(mayor que),$gte(mayor o igual),$lt(menor que),$lte(menor o igual),$ne(diferente de). - Expresiones regulares:
$regexpara búsquedas de patrones de texto.
Limitación, omisión y ordenamiento:
db.empleados.find({ salario: { $gt: 50000 } })
.sort({ salario: -1 })
.skip(0)
.limit(10);
Proyección de campos: Permite devolver solo los campos específicos necesarios.
db.empleados.find(
{ departamento: "TI" },
{ nombre: 1, salario: 1, _id: 0 }
);
Condiciones lógicas (AND / OR):
db.empleados.find({
$or: [
{ departamento: "TI" },
{ salario: { $gte: 70000 } }
]
});
Agregaciones y Conteos
Para contar documentos que coincidan con un criterio:
db.empleados.countDocuments({ departamento: "TI" });
El framework de agregación permite realizar cálculos complejos, como promedios, sumas y agrupaciones, procesando los datos a través de una tubería (pipeline) de etapas para transformar y devolver resultados analíticos.