MongoDB

img

¿Qué es MongoDB?

MongoDB es un sistema de gestión de bases de datos NoSQL que almacena la información en documentos BSON (una extensión de JSON).

Se diferencia de bases de datos relacionales como MySQL o PostgreSQL en varios aspectos clave:

2. ¿Para qué se usa?

MongoDB es ideal para proyectos que requieren agilidad y flexibilidad en el modelado de datos, como:

Ejemplo: redes sociales, plataformas de e-commerce, aplicaciones de streaming o sistemas de IoT.

3. ¿Qué puedo construir con MongoDB?

Con MongoDB puedes crear desde aplicaciones simples hasta sistemas empresariales complejos.
Algunos ejemplos incluyen:

4. ¿Cuándo es más conveniente usarlo?

MongoDB sobresale en escenarios donde:

Si necesitas relaciones complejas y fuertes restricciones de integridad, una base SQL podría ser mejor.

Buenas prácticas recomendadas

Para trabajar eficientemente con MongoDB, sigue estas recomendaciones:

Estructura y diseño

Rendimiento

Código limpio

Seguridad


Resumen rápido

Síntesis rápida de lo aprendido sobre MongoDB.

✅ Fortalezas principales:

⚠️ Debilidades principales:

🛠️ Cuándo usarlo:

🚫 Cuándo evitarlo:


Temas


Conceptos relacionados

Antes de trabajar con MongoDB, es importante entender los siguientes conceptos:

1. Documentos

{
  "nombre": "Fernando",
  "edad": 28,
  "email": "fernando@example.com"
}

2. Colecciones

3. Base de datos

4. BSON

5. ObjectId

{
  "_id": "651c5f4b8d0f5e9d12345678",
  "nombre": "Producto 1",
  "precio": 1500
}

6. CRUD

Operaciones esenciales que se realizan en una base de datos:

operación acción
Create Crear documentos.
Read Leer datos.
Update Actualizar documentos.
Delete Eliminar documentos.

7. Índices

Ejemplo: indexar el campo email en una colección de usuarios.

db.usuarios.createIndex({ email: 1 });

8. Agregaciones (Aggregation Pipeline)

Ejemplo básico: contar usuarios por país.

db.usuarios.aggregate([
  { $group: { _id: "$pais", totalUsuarios: { $sum: 1 } } },
]);

9. Replica Set

10. Sharding

🔼 temas


Herramientas recomendadas

Para trabajar con MongoDB de forma eficiente, estas son las herramientas más importantes:

1. MongoDB Compass

Descarga: https://www.mongodb.com/products/compass

2. MongoDB Atlas

Plataforma en la nube para gestionar bases de datos MongoDB.

Características clave:

Uso recomendado: hosting de bases de datos para producción y pruebas.
Registro gratuito: https://www.mongodb.com/cloud/atlas

3. Extensión MongoDB for VS Code

Instalar desde el Marketplace de VS Code:
MongoDB for VS Code

4. Mongoose (ODM para Node.js)

Librería para interactuar con MongoDB en proyectos de Node.js.

Beneficios:

npm install mongoose

5. Robo 3T (alternativa a Compass)

Descarga: https://robomongo.org/

6. Node.js + Express

MongoDB se integra perfectamente con Node.js y Express para construir APIs y aplicaciones backend modernas.

Paquete oficial de MongoDB para Node.js:

npm install mongodb

7. Docker

docker run -d -p 27017:27017 --name my-mongo mongo

8. Mongosh

Instalación: https://www.mongodb.com/try/download/shell


📌 Resumen rápido de herramientas

Herramienta Uso principal Tipo
MongoDB Compass Visualización y gestión de datos GUI
MongoDB Atlas Base de datos en la nube Cloud Service
Mongoose ODM para Node.js Librería
VS Code Extension Conectar MongoDB desde el editor Extensión
Robo 3T Cliente ligero de MongoDB GUI
Docker MongoDB en contenedor Virtualización
Mongosh Interacción con MongoDB en terminal CLI

🔼 temas


Snippets rápidos

Fragmentos de código para tareas comunes en Node.js con MongoDB.

1. Conexión básica con Mongoose

import mongoose from "mongoose";

mongoose
  .connect("mongodb://localhost:27017/mi_base")
  .then(() => console.log("Conectado a MongoDB"))
  .catch((err) => console.error("Error de conexión", err));

2. Definir un modelo

const usuarioSchema = new mongoose.Schema({
  nombre: String,
  email: { type: String, required: true },
  edad: Number,
});

const Usuario = mongoose.model("Usuario", usuarioSchema);

3. Crear un documento

const nuevoUsuario = new Usuario({
  nombre: "Ana",
  email: "ana@example.com",
  edad: 25,
});
await nuevoUsuario.save();

4. Consultar documentos

const usuarios = await Usuario.find(); // Todos los usuarios
const ana = await Usuario.findOne({ nombre: "Ana" }); // Un usuario específico

5. Actualizar un documento

await Usuario.updateOne({ nombre: "Ana" }, { edad: 26 });

6. Eliminar un documento

await Usuario.deleteOne({ nombre: "Ana" });

7. Conexión nativa sin Mongoose

import { MongoClient } from "mongodb";

const cliente = new MongoClient("mongodb://localhost:27017");
await cliente.connect();

const db = cliente.db("mi_base");
const coleccion = db.collection("usuarios");

await coleccion.insertOne({ nombre: "Carlos", edad: 30 });

🔼 temas


Comandos

Comandos básicos para trabajar desde mongosh o la terminal.

1. Conectarse a MongoDB

mongosh

Si está en otro host/puerto:

mongosh "mongodb://localhost:27017"

2. Mostrar bases de datos

show dbs

3. Crear o usar una base de datos

use mi_base

4. Mostrar colecciones

show collections

5. Insertar documentos

db.usuarios.insertOne({ nombre: "Ana", edad: 25 });
db.usuarios.insertMany([
  { nombre: "Luis", edad: 30 },
  { nombre: "Carla", edad: 22 },
]);

6. Consultar documentos

db.usuarios.find(); // Todos
db.usuarios.find({ edad: { $gt: 25 } }); // Condición
db.usuarios.findOne({ nombre: "Ana" }); // Solo uno

7. Actualizar documentos

db.usuarios.updateOne({ nombre: "Ana" }, { $set: { edad: 26 } });

db.usuarios.updateMany({ edad: { $lt: 18 } }, { $set: { estado: "menor" } });

8. Eliminar documentos

db.usuarios.deleteOne({ nombre: "Ana" });
db.usuarios.deleteMany({ edad: { $lt: 18 } });

9. Crear índice

db.usuarios.createIndex({ email: 1 });

10. Contar documentos

db.usuarios.countDocuments();

11. Agregaciones básicas

Contar usuarios por país:

db.usuarios.aggregate([{ $group: { _id: "$pais", total: { $sum: 1 } } }]);

12. Exportar e importar datos

Exportar colección:

mongoexport --db mi_base --collection usuarios --out usuarios.json

Importar colección:

mongoimport --db mi_base --collection usuarios --file usuarios.json

📌 Resumen rápido de comandos

Acción Comando
Ver bases de datos show dbs
Usar base de datos use mi_base
Ver colecciones show collections
Insertar db.usuarios.insertOne({nombre: "Ana"})
Consultar db.usuarios.find({edad: {$gt: 25}})
Actualizar db.usuarios.updateOne({...}, {$set: {...}})
Eliminar db.usuarios.deleteOne({...})
Crear índice db.usuarios.createIndex({email: 1})
Contar documentos db.usuarios.countDocuments()
Agregar datos db.usuarios.aggregate([...])

🔼 temas


Conceptos Claves

🟢 Básico

1. Estructura principal: Documentos y Colecciones

Ejemplo de documento:

{
  "nombre": "Ana",
  "edad": 25,
  "email": "ana@example.com"
}

Colección: usuarios puede contener miles de documentos similares.

2. BSON vs JSON

MongoDB usa BSON porque optimiza la lectura y escritura de datos, y soporta tipos que JSON no maneja.

3. Operaciones CRUD básicas

Operación Sintaxis ejemplo
Insertar db.usuarios.insertOne({ nombre: "Ana", edad: 25 })
Buscar db.usuarios.find({ nombre: "Ana" })
Actualizar db.usuarios.updateOne({ nombre: "Ana" }, { $set: { edad: 26 } })
Eliminar db.usuarios.deleteOne({ nombre: "Ana" })

4. ObjectID

Es el identificador único que MongoDB asigna automáticamente a cada documento en el campo _id.

Tiene 12 bytes, distribuidos así:

Esto asegura unicidad global sin necesidad de un servidor central.

Ejemplo:
64f83d2a8d9b4e7cbb123456

5. Crear un índice

db.usuarios.createIndex({ email: 1 });

Importancia:
Los índices aceleran la búsqueda de documentos, evitando que MongoDB recorra toda la colección (full collection scan).


🟡 Intermedio

6. Tipos de índices y casos de uso

Tipo Descripción Ejemplo de uso
Single-field Índice en un solo campo. db.usuarios.createIndex({ email: 1 })
Compound Índice en múltiples campos. db.usuarios.createIndex({ nombre: 1, edad: -1 })
Text Búsqueda de texto. db.posts.createIndex({ contenido: "text" })
Geoespacial Para ubicaciones y mapas. db.tiendas.createIndex({ ubicacion: "2dsphere" })
Hashed Para sharding basado en hash. db.usuarios.createIndex({ userId: "hashed" })

7. Documentos embebidos vs Referencias

Embebidos (Embedded):**

Ejemplo:

{
  "nombre": "Ana",
  "direccion": {
    "calle": "Av. Siempre Viva",
    "ciudad": "Springfield"
  }
}

Referencias (Referencing):**

Ejemplo:

{
  "nombre": "Ana",
  "direccionId": ObjectId("64f83d2a8d9b4e7cbb123456")
}

8. Diferencia entre $set, $inc y $push

Operador Uso Ejemplo
$set Actualiza el valor de un campo. db.usuarios.updateOne({ nombre: "Ana" }, { $set: { edad: 30 } })
$inc Incrementa o decrementa un valor numérico. db.usuarios.updateOne({ nombre: "Ana" }, { $inc: { puntos: 5 } })
$push Agrega un elemento a un arreglo. db.usuarios.updateOne({ nombre: "Ana" }, { $push: { hobbies: "correr" } })

9. Schemas en MongoDB

MongoDB es schema-less (sin esquema rígido), pero se pueden definir esquemas opcionales usando librerías como Mongoose.

Beneficios:

Buenas prácticas:

10. Replica set

Grupo de servidores que mantienen copias sincronizadas de los datos.

Funciones clave:

Funcionamiento:

  1. Un Primary recibe todas las escrituras.
  2. Los Secondaries replican los datos.
  3. Si el Primary falla, uno de los Secondaries es elegido automáticamente como nuevo Primary.

🔴 Avanzado

11. Join entre colecciones con $lookup

db.pedidos.aggregate([
  {
    $lookup: {
      from: "clientes",
      localField: "clienteId",
      foreignField: "_id",
      as: "infoCliente",
    },
  },
]);

Similar a un LEFT JOIN en SQL.

12. Estrategias de escalabilidad horizontal

Sharding:

Replica Sets:

13. Transacciones en MongoDB

Ejemplo básico:

const session = client.startSession();
session.startTransaction();

try {
  await db
    .collection("cuentas")
    .updateOne({ _id: 1 }, { $inc: { saldo: -100 } }, { session });

  await db
    .collection("cuentas")
    .updateOne({ _id: 2 }, { $inc: { saldo: 100 } }, { session });

  await session.commitTransaction();
} catch (e) {
  await session.abortTransaction();
}

14. Consulta optimizada para los 10 documentos más recientes

Estrategia:

  1. Crear un índice en el campo fecha:
    db.posts.createIndex({ fecha: -1 });
    
  2. Consulta optimizada:
    db.posts.find().sort({ fecha: -1 }).limit(10);
    

Esto evita un full collection scan y utiliza el índice directamente.

15. Modelado de datos para red social

Colección usuarios:

{
  "_id": ObjectId("..."),
  "nombre": "Ana",
  "amigos": [ObjectId("..."), ObjectId("...")]
}

Colección posts:

{
  "_id": ObjectId("..."),
  "usuarioId": ObjectId("..."),
  "contenido": "Mi primer post",
  "likes": [ObjectId("..."), ObjectId("...")]
}

Estrategia:

🔼 temas