Tutorial práctico en español para aprender MongoDB desde cero hasta un uso profesional con MongoDB Atlas.
Autor: Alejandro Di Stefano
Este repositorio está diseñado como guía de aprendizaje, laboratorio y referencia técnica de MongoDB.
No es únicamente una colección de comandos: explica los conceptos que hay detrás de una base documental, cómo modelar datos, cómo consultar de forma eficiente, cómo crear índices, cómo utilizar Aggregation Framework y cómo operar MongoDB Atlas con criterios adecuados de seguridad y producción.
La documentación está pensada para tres usos:
- aprender MongoDB desde cero;
- utilizarla como material de formación;
- consultar rápidamente comandos y patrones durante el desarrollo.
Los ejemplos utilizan principalmente
mongosh. Los conceptos son aplicables a los drivers oficiales de Node.js, Java, Go, Python, C#, PHP y otros lenguajes.
| Capítulo | Tema |
|---|---|
| 01 — Fundamentos e instalación | Arquitectura documental, BSON, mongod, mongosh, Compass e instalación |
| 02 — CRUD y consultas | Insert, find, operadores, arrays, proyecciones, update, delete y cursores |
| 03 — Modelado de datos | Embedding, references, cardinalidad, validación y diseño de documentos |
| 04 — Índices y performance | Índices, explain(), selectividad, ESR, covered queries y optimización |
| 05 — Aggregation Framework | Pipelines, $match, $group, $lookup, $facet, $unwind y análisis |
| 06 — MongoDB Atlas | Deployments, usuarios, Network Access, connection strings, Search y seguridad |
| 07 — Operación y producción | Backup, restore, transacciones, observabilidad, migraciones y producción |
| Cheat Sheet | Referencia rápida de comandos y patrones frecuentes |
MongoDB es una base de datos documental. La información se almacena como documentos BSON agrupados en colecciones.
{
_id: ObjectId("..."),
nombre: "Notebook Pro",
precio: 1250,
stock: 8,
categorias: ["hardware", "notebooks"],
fabricante: {
nombre: "Example Corp",
pais: "AR"
},
activo: true
}| SQL | MongoDB |
|---|---|
| Database | Database |
| Table | Collection |
| Row | Document |
| Column | Field |
| Primary Key | _id |
| JOIN | $lookup o modelado embebido |
| SELECT | find() / aggregate() |
| INSERT | insertOne() / insertMany() |
| UPDATE | updateOne() / updateMany() |
| DELETE | deleteOne() / deleteMany() |
MongoDB no debe interpretarse como una base de datos "sin esquema". El esquema es flexible, pero en sistemas reales debe diseñarse, validarse y evolucionarse de forma controlada.
Para un entorno de desarrollo completo se recomienda conocer:
- MongoDB Community Server — servidor local.
- MongoDB Shell (
mongosh) — cliente de línea de comandos. - MongoDB Compass — interfaz gráfica oficial.
- MongoDB Database Tools —
mongodump,mongorestore,mongoimport,mongoexport, etc. - MongoDB Atlas — plataforma administrada en la nube.
Enlaces oficiales:
- https://www.mongodb.com/
- https://www.mongodb.com/try/download/community
- https://www.mongodb.com/try/download/shell
- https://www.mongodb.com/try/download/database-tools
- https://www.mongodb.com/products/tools/compass
- https://www.mongodb.com/atlas
mongod --version
mongosh --version
mongodump --versionmongod --dbpath="D:\mongodb-data"El directorio indicado debe existir previamente.
Si MongoDB fue instalado como servicio, puede que el servidor ya se encuentre ejecutándose.
mongoshConexión local por defecto:
mongodb://127.0.0.1:27017
use tiendadb.productos.insertOne({
nombre: "Notebook",
precio: 1200,
stock: 10,
activo: true
})db.productos.find({ activo: true })db.usuarios.insertOne({
nombre: "Ana",
edad: 31,
activo: true
})db.usuarios.insertMany([
{ nombre: "Ana", edad: 31, activo: true },
{ nombre: "Luis", edad: 27, activo: true },
{ nombre: "Carla", edad: 38, activo: false }
])db.usuarios.find({ activo: true })db.usuarios.findOne({ nombre: "Ana" })db.usuarios.updateOne(
{ nombre: "Ana" },
{ $set: { edad: 32 } }
)db.usuarios.deleteOne({ nombre: "Ana" })Antes de ejecutar
updateMany()odeleteMany(), validá el filtro utilizandofind()para confirmar qué documentos serán afectados.
db.usuarios.find({ edad: { $gt: 18 } })
db.usuarios.find({ edad: { $gte: 18 } })
db.usuarios.find({ edad: { $lt: 65 } })
db.usuarios.find({ edad: { $lte: 65 } })
db.usuarios.find({ edad: { $ne: 30 } })
db.usuarios.find({ edad: { $in: [25, 30, 35] } })
db.usuarios.find({ edad: { $nin: [25, 30, 35] } })db.usuarios.find({
$and: [
{ activo: true },
{ edad: { $gte: 18 } }
]
})db.usuarios.find({
$or: [
{ rol: "admin" },
{ rol: "owner" }
]
})db.usuarios.find({ nombre: /^ana/i })db.usuarios.find({
nombre: {
$regex: "^ana",
$options: "i"
}
})db.usuarios.find(
{ activo: true },
{ nombre: 1, email: 1, _id: 0 }
)db.usuarios.find().sort({ edad: -1 })1: ascendente.-1: descendente.
db.usuarios.find()
.sort({ _id: 1 })
.skip(20)
.limit(10)Para grandes volúmenes, skip() puede degradarse. En APIs de alto tráfico conviene evaluar cursor-based pagination utilizando un campo estable, ordenable e indexado.
{
nombre: "Alejandro",
skills: ["MongoDB", "Node.js", "Go"]
}Buscar por un valor del array:
db.usuarios.find({ skills: "MongoDB" })Agregar sin duplicar:
db.usuarios.updateOne(
{ nombre: "Alejandro" },
{ $addToSet: { skills: "Docker" } }
)Eliminar:
db.usuarios.updateOne(
{ nombre: "Alejandro" },
{ $pull: { skills: "Docker" } }
)El diseño entre embedding y references es una de las decisiones centrales al modelar MongoDB. Está desarrollado en detalle en Modelado de datos.
Un sistema puede funcionar correctamente y aun así escalar mal. Los índices forman parte del diseño de la aplicación.
db.usuarios.createIndex({ email: 1 })db.usuarios.createIndex(
{ email: 1 },
{ unique: true }
)db.pedidos.createIndex({ clienteId: 1, createdAt: -1 })db.pedidos
.find({ clienteId: ObjectId("64b000000000000000000001") })
.sort({ createdAt: -1 })
.explain("executionStats")Conceptos que conviene dominar:
COLLSCANvsIXSCAN;- selectividad;
- índices compuestos;
- estrategia ESR;
- multikey indexes;
- partial indexes;
- TTL indexes;
- covered queries;
- costo de escritura de cada índice.
Aggregation permite construir pipelines para transformar y analizar información.
db.ventas.aggregate([
{
$match: {
estado: "paid"
}
},
{
$group: {
_id: "$clienteId",
total: { $sum: "$importe" },
operaciones: { $sum: 1 }
}
},
{
$sort: {
total: -1
}
}
])Stages frecuentes:
$match$project$set$unset$group$sort$limit$skip$unwind$lookup$facet$count
MongoDB Atlas es la plataforma administrada de MongoDB en la nube y permite desplegar, proteger, monitorear y escalar deployments de MongoDB sin administrar directamente toda la infraestructura subyacente.
- Crear un proyecto.
- Crear un database deployment.
- Crear un database user.
- Configurar Network Access / IP Access List.
- Obtener el connection string.
- Conectarse con
mongosh, Compass o el driver de la aplicación.
mongosh "mongodb+srv://cluster0.example.mongodb.net/tienda" --username app_userMONGODB_URI=mongodb+srv://app_user:<password>@cluster0.example.mongodb.net/tienda?retryWrites=true&w=majorityNunca se deben versionar credenciales reales.
Un Atlas user permite acceder a la interfaz y administrar recursos de Atlas.
Un database user se utiliza para autenticarse contra MongoDB y acceder a las bases de datos según los permisos definidos.
Son conceptos diferentes y no deben confundirse.
Además de credenciales válidas, el cliente debe poder acceder desde una dirección o red permitida.
En producción:
- aplicar mínimo privilegio;
- restringir rangos de red;
- evitar
0.0.0.0/0salvo necesidades temporales justificadas; - rotar credenciales;
- separar usuarios y secretos por ambiente;
- utilizar conexiones privadas cuando la arquitectura lo requiera.
El capítulo MongoDB Atlas profundiza en configuración, seguridad, backups, monitoring, Atlas Search, Vector Search, private networking y troubleshooting.
mongodump --uri="mongodb://localhost:27017/tienda" --out=./backupmongorestore --uri="mongodb://localhost:27017" ./backupmongoexport \
--uri="mongodb://localhost:27017/tienda" \
--collection=productos \
--out=productos.jsonmongoimport \
--uri="mongodb://localhost:27017/tienda" \
--collection=productos \
--file=productos.json \
--jsonArraymongodump/mongorestore y mongoexport/mongoimport no son equivalentes: los primeros están orientados a backup lógico BSON; los segundos al intercambio de datos en JSON/CSV.
- Modelar los documentos según los patrones de acceso.
- Definir índices a partir de consultas reales.
- Revisar queries críticas con
explain("executionStats"). - Aplicar schema validation cuando corresponda.
- No utilizar usuarios administrativos desde la aplicación.
- Aplicar mínimo privilegio.
- Mantener secretos fuera del repositorio.
- Separar credenciales por ambiente.
- Restringir Network Access en Atlas.
- Configurar pooling y timeouts en el driver.
- Implementar observabilidad y monitoreo.
- Definir política de backups.
- Probar periódicamente el proceso de restauración.
- Diseñar migraciones y evolución de esquema.
- Revisar crecimiento de colecciones e índices.
Fundamentos
↓
CRUD y operadores
↓
Modelado documental
↓
Índices + explain()
↓
Aggregation Framework
↓
MongoDB Atlas
↓
Backups + seguridad + producción
La recomendación es avanzar en ese orden. En MongoDB, aprender comandos sin comprender modelado e índices genera una falsa sensación de dominio bastante rápido.
Los archivos originales del repositorio se mantienen como material de práctica:
cmd0.jstemporal.jspersonas.jsonMOCK_DATA.jsondump/img/_ref/
La documentación actualizada se encuentra en docs/.
La versión v2.0.0 representa una reestructuración mayor del repositorio: pasa de una colección de apuntes y comandos a una guía técnica completa de MongoDB y MongoDB Atlas.
Consultá CHANGELOG.md para ver el detalle de cambios y las notas preparadas para el release.
Repositorio creado y mantenido por Alejandro Di Stefano.
Si este material te resulta útil, podés marcar el repositorio con una ⭐ para tenerlo disponible como referencia.