MongoDB: la revolución NoSQL
MongoDB es la base de datos NoSQL más popular. Almacena datos como documentos BSON, ofreciendo esquemas flexibles, escalabilidad horizontal y alta velocidad de desarrollo.
Conceptos clave
En MongoDB los datos se organizan en: Base de datos → Colecciones → Documentos. A diferencia de SQL, no hay tablas ni filas. Cada documento es un objeto BSON con su propio esquema — un documento puede tener campos que otro no tiene.
El _id es un ObjectId único generado automáticamente (12 bytes: timestamp + machine ID + process ID + counter). También puedes usar tu propio _id (UUID, número, etc.).
Instalación
Opciones para empezar con MongoDB:
- macOS:
brew install mongodb-community@7+brew services start mongodb-community@7 - Docker:
docker run --name mongodb -p 27017:27017 -d mongo:7 - MongoDB Compass: GUI oficial para explorar y gestionar datos visualmente
- mongosh: shell interactiva — solo escribe
mongosh
CRUD básico
Las cuatro operaciones fundamentales en MongoDB:
CREATE
db.usuarios.insertOne({
nombre: "Ana",
email: "ana@email.com",
edad: 28,
ciudad: "Madrid"
});
db.usuarios.insertMany([
{ nombre: "Luis", edad: 35, ciudad: "Barcelona" },
{ nombre: "María", edad: 42, ciudad: "Valencia" }
]);READ
db.usuarios.find({ edad: { $gt: 30 } });
db.usuarios.find({ ciudad: "Madrid" }).sort({ edad: -1 }).limit(5);
db.usuarios.findOne({ email: "ana@email.com" });UPDATE
db.usuarios.updateOne(
{ nombre: "Ana" },
{ $set: { edad: 29 } }
);
db.usuarios.updateMany(
{ ciudad: "Madrid" },
{ $set: { pais: "España" } }
);DELETE
db.usuarios.deleteOne({ email: null });
db.usuarios.deleteMany({ edad: { $lt: 18 } });Operadores de query
MongoDB ofrece operadores para consultas avanzadas:
- Comparación:
$gt,$gte,$lt,$lte,$in,$ne - Texto:
$regex(búsqueda con expresiones regulares) - Existencia:
$exists,$type - Arrays:
$all,$elemMatch,$size - Lógicos:
$and,$or,$not
-- Usuarios de Madrid o Barcelona con edad entre 25 y 40
db.usuarios.find({
$and: [
{ ciudad: { $in: ["Madrid", "Barcelona"] } },
{ edad: { $gte: 25, $lte: 40 } }
]
});
-- Búsqueda textual con regex
db.usuarios.find({ email: { $regex: /@gmail.com$/i } });Aggregation Pipeline
El equivalente a GROUP BY, JOINs y transformaciones complejas. Los documentos pasan por una tubería de etapas:
db.pedidos.aggregate([
{ $match: { estado: "completado" } },
{ $group: {
_id: "$usuario_id",
total: { $sum: "$total" },
count: { $sum: 1 }
}},
{ $sort: { total: -1 } },
{ $limit: 10 },
{ $lookup: {
from: "usuarios",
localField: "_id",
foreignField: "_id",
as: "usuario"
}},
{ $unwind: "$usuario" },
{ $project: {
nombre: "$usuario.nombre",
total: 1,
pedidos: 1
}}
]);Etapas clave: $match (filtro, como WHERE), $group (agrupación), $sort, $limit, $project (seleccionar campos), $lookup (como JOIN), $unwind (desanidar arrays).
$match y $limit lo antes posible en el pipeline para reducir los documentos que pasan a las siguientes etapas y mejorar el rendimiento.Índices
Los índices aceleran las consultas drásticamente:
// Índice simple
db.usuarios.createIndex({ email: 1 });
// Índice compuesto
db.usuarios.createIndex({ ciudad: 1, edad: -1 });
// Índice parcial
db.pedidos.createIndex(
{ total: 1 },
{ partialFilterExpression: { estado: "completado" } }
);
// Índice de texto
db.usuarios.createIndex({ nombre: "text", email: "text" });
// Analizar consulta
db.usuarios.find({ email: "ana@email.com" }).explain("executionStats");MongoDB usa índices automáticamente. .explain("executionStats") te muestra si se usó un INDEX SCAN (bueno) o un COLLSCAN (malo — revisa toda la colección).
$lookup o embebiendo datos relacionados dentro del mismo documento. Las transacciones multi-documento ACID están disponibles desde MongoDB 4.0. El sharding horizontal es nativo y permite escalar entre cientos de servidores.Ejercicios
MongoDB brilla cuando necesitas flexibilidad de esquema, escalabilidad horizontal y desarrollo rápido. Combínalo con SQL para sacar lo mejor de ambos mundos.