"¿Debería usar MongoDB o MySQL?" es una de las preguntas más frecuentes en el desarrollo de aplicaciones. La respuesta depende de tu caso de uso. Esta guía desmitifica NoSQL y te ayuda a elegir la herramienta correcta.
La diferencia fundamental
MySQL (SQL/Relacional): los datos se almacenan en tablas con estructura fija (esquema). Las relaciones entre entidades se manejan con claves foráneas y JOINs. ACID garantizado.
MongoDB (NoSQL/Documental): los datos se almacenan como documentos JSON (BSON internamente). Sin esquema fijo — cada documento puede tener campos diferentes. Escala horizontalmente con mayor facilidad.
Comparativa técnica
| Característica | MySQL | MongoDB |
|---|---|---|
| Modelo de datos | Tablas y filas | Colecciones y documentos JSON |
| Esquema | Rígido (definido al crear) | Flexible (schema-less) |
| Relaciones | JOINs nativos | Embeber documentos o $lookup |
| Transacciones | ACID completo | ACID desde v4.0 (multi-documento) |
| Escalado | Vertical (más potente) o read replicas | Horizontal (sharding nativo) |
| Lenguaje de consulta | SQL estándar | API de MongoDB (MQL) |
MongoDB en práctica
// Conectar desde Node.js
const { MongoClient } = require('mongodb');
const client = new MongoClient('mongodb://localhost:27017');
await client.connect();
const db = client.db('solutions');
const articulos = db.collection('articulos');
// Insertar un documento (sin definir esquema previo)
await articulos.insertOne({
titulo: 'Introducción a Docker',
slug: 'docker-intro',
categoria: 'docker',
tags: ['contenedores', 'devops', 'virtualización'],
autor: {
nombre: 'Paquito',
email: 'p@ej.com'
},
vistas: 847,
publicado: true,
fecha: new Date()
});
// Consultar con filtros
const resultado = await articulos.find({
categoria: 'docker',
publicado: true
}).sort({ fecha: -1 }).limit(10).toArray();
// Actualizar
await articulos.updateOne(
{ slug: 'docker-intro' },
{ $inc: { vistas: 1 } } // incrementar contador
);
Desde la shell de MongoDB
# Conectar
mongosh
# Seleccionar/crear base de datos
use solutions
# Ver colecciones
show collections
# Consultas básicas
db.articulos.find({ categoria: 'redes' }).limit(5)
db.articulos.find({ vistas: { $gt: 500 } }).sort({ vistas: -1 })
db.articulos.countDocuments({ publicado: true })
# Aggregation pipeline (equivalente a GROUP BY en SQL)
db.articulos.aggregate([
{ $match: { publicado: true } },
{ $group: { _id: '$categoria', total: { $sum: 1 }, vistas: { $sum: '$vistas' } } },
{ $sort: { vistas: -1 } }
])
¿Cuándo elegir cada uno?
Usa MySQL cuando: los datos tienen estructura clara y estable · necesitas JOINs complejos · la consistencia ACID es crítica (pagos, inventarios, banca) · el equipo conoce SQL
Usa MongoDB cuando: el esquema varía mucho entre registros (ej: catálogo de productos con atributos diferentes) · necesitas escalar horizontalmente a millones de escrituras/segundo · los datos son naturalmente jerárquicos (documentos con subdocumentos) · prototipas rápido y el esquema cambiará
"No existe la base de datos perfecta para todos los casos. Existe la base de datos correcta para tu caso de uso."