"¿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."