Café y Código

3. MongoDB: CRUD ⚡

¿Qué es CRUD en MongoDB?

CRUD son las cuatro operaciones básicas sobre datos: Create (crear), Read (leer), Update (actualizar) y Delete (eliminar). En bases relacionales suele mapearse a INSERT, SELECT, UPDATE y DELETE. En MongoDB se hace sobre colecciones de documentos, usando métodos del driver o de mongosh.

  • CreateinsertOne, insertMany
  • Readfind, findOne, countDocuments
  • UpdateupdateOne, updateMany, replaceOne
  • DeletedeleteOne, deleteMany

El primer argumento de casi todas las operaciones es un filtro: un documento JSON con condiciones (por ejemplo { anio: 2025 } o { "precio": { "$lte": 50 } } usando operadores como $lte, $in, $regex, etc.).

C — Create (insertar)

insertOne agrega un documento a la colección. insertMany agrega varios en una sola operación (útil para cargas iniciales o migraciones).

Create
JAVASCRIPT
1 db.libros.insertOne({
2 titulo: "NoSQL explicado",
3 anio: 2025,
4 tags: ["datos", "mongodb"]
5 });
6
7 db.libros.insertMany([
8 { titulo: "A", anio: 2024 },
9 { titulo: "B", anio: 2023 }
10 ]);

Si no enviás _id, MongoDB puede generar uno automáticamente (ObjectId).

R — Read (leer)

find devuelve un cursor con todos los documentos que cumplen el filtro (podés encadenar .limit(), .sort(), etc.). findOne devuelve solo el primero o null. La proyección (segundo argumento) indica qué campos traer: 1 incluir, 0 excluir (excepto _id, que hay que excluir explícitamente si no lo querés).

Read
JAVASCRIPT
1 // Todos los libros de 2025 en adelante
2 db.libros.find({ anio: { $gte: 2020 } });
3
4 // Un solo documento (el primero que coincida)
5 db.libros.findOne({ titulo: "NoSQL explicado" });
6
7 // Solo título y año (sin _id)
8 db.libros.find({ anio: 2025 }, { titulo: 1, anio: 1, _id: 0 });
9
10 // Cuántos documentos cumplen el filtro
11 db.libros.countDocuments({ anio: { $gte: 2024 } });

Los operadores como $gte (mayor o igual), $in, $regex para texto, etc., van dentro del documento de filtro y componen el “lenguaje de consulta” de MongoDB.

U — Update (actualizar)

No se hace con un UPDATE ... SET como en SQL: pasás el filtro y un documento de operadores. Lo más habitual es $set para modificar o añadir campos, $inc para sumar a números, $unset para quitar un campo. replaceOne reemplaza el documento entero (menos común si solo querés tocar algunos campos).

Update
JAVASCRIPT
1 // Actualizar un documento que coincida con el filtro
2 db.libros.updateOne(
3 { titulo: "NoSQL explicado" },
4 { $set: { stock: 12 }, $inc: { visitas: 1 } }
5 );
6
7 // Varios documentos a la vez (mismo criterio de filtro)
8 db.libros.updateMany(
9 { anio: { $lt: 2020 } },
10 { $set: { archivado: true } }
11 );

D — Delete (eliminar)

deleteOne borra como mucho un documento (el primero que cumpla el filtro). deleteMany borra todos los que cumplan. Conviene usar filtros muy específicos (a menudo por _id) para no borrar de más en producción.

Delete
JAVASCRIPT
1 // Borrar por _id (recomendado cuando conocés el id exacto)
2 db.libros.deleteOne({ _id: ObjectId("...") });
3
4 // Borrar todos los que cumplan la condición (¡cuidado!)
5 db.libros.deleteMany({ archivado: true });

En producción, los índices sobre campos usados en filtros aceleran lecturas y escrituras y evitan escaneos completos de la colección cuando crece el volumen.

Buenas prácticas rápidas

  • Modelá pensando en las consultas frecuentes (qué vas a leer junto).
  • Evitá documentos gigantes sin necesidad; a veces conviene referenciar otra colección.
  • Definí índices para campos usados en filtros y ordenamientos críticos.
Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.