Saltar al contenido

MongoDB — documentos, no tablas.

Si en SQL los datos viven en filas con columnas fijas, en Mongo viven en documentos JSON que pueden anidar objetos, arrays, lo que quieras. Cada documento tiene su propia forma. La estructura no se declara antes — se descubre al insertar.

01Vocabulario que sí cambia

Database
Sigue siendo la base de datos. Una por proyecto, normalmente.
Collection
El equivalente a una tabla. Un grupo de documentos relacionados (posts, users).
{ }
Document
Un objeto JSON con un campo único _id. El equivalente de una fila, pero cada uno puede tener su propia forma.
[ ]
Embedded
Dentro de un documento puedes guardar arrays u objetos anidados. Adiós a tablas auxiliares para datos que viven juntos.

Un documento se ve así. Lo importante es que estos cuatro campos no están "predefinidos" en ningún lado — el motor los acepta al insertar:

{
  _id: "p001",
  title: "Por qué empezar con SQL antes que NoSQL",
  author: "profesor_db",
  tags: ["sql", "tutorial"],
  stats: { views: 142, likes: 28 },
  comments: [
    { by: "ana",  text: "Buenísimo!", likes: 3 },
    { by: "luis", text: "¿Y cuándo Mongo?", likes: 1 }
  ]
}
¿Por qué guardar comentarios DENTRO del post?

En SQL tendrías una tabla comments y un JOIN cada vez que muestras el post. En Mongo, mostrar el post completo es una sola lectura. Ese principio se llama embedding y es el corazón del diseño con documentos.

02CRUD — los cuatro verbos en Mongo

El shell de Mongo usa JavaScript. Aquí está la versión sin floritura:

// Insertar
db.posts.insertOne({ title: "Hola", author: "ana", likes: 0 })

// Leer
db.posts.find({ author: "ana" })
db.posts.findOne({ _id: "p001" })

// Actualizar
db.posts.updateOne({ _id: "p001" }, { $set: { title: "Nuevo título" } })

// Borrar
db.posts.deleteOne({ _id: "p001" })

Lo único "raro" al principio son los operadores con $. En el query sirven para comparar ($gt, $in…), en el update sirven para modificar ($set, $inc, $push…).

03Caso 1 · $push Blog con comentarios

Este es el ejemplo clásico donde Mongo brilla: un post con un array de comentarios anidado. Cuando alguien comenta, no insertas en otra tabla — haces $push al array del documento.

Escribe un comentario abajo y mira el documento entero a la derecha. Cada acción (comentar, dar like, borrar) imprime el comando Mongo exacto.

Blog · post con comentarios
collection posts · documento con arrays anidados
sql · tutorial · aprender

Por qué empezar con SQL antes que NoSQL

@profesor_db👁 142
2 comentarios
@ana
Buenísimo, muy claro 👏
@luis
¿Y cuándo se justifica Mongo entonces?
Documento completo · posts/p001
{
"_id": "p001",
"title": "Por qué empezar con SQL antes que NoSQL",
"author": "profesor_db",
"tags": ["sql", "tutorial", "aprender"],
"stats": {
"views": 142,
"likes": 28
}
,
"comments": [
{
"by": "ana",
"text": "Buenísimo, muy claro 👏",
"likes": 3
}
,
{
"by": "luis",
"text": "¿Y cuándo se justifica Mongo entonces?",
"likes": 1
}
"]"
}
Últimos comandos
Aún no hay comandos. Interactúa a la izquierda →

04Operadores de query — filtrar como pro

=
Igualdad
{ author: "ana" }. Para algo distinto: { author: { $ne: "ana" } }.
Rangos
$gt, $gte, $lt, $lte. { price: { $lte: 20000 } }.
Listas
{ category: { $in: ["café","té"] } } es como WHERE … IN.
∧∨
Combinación
$and, $or aceptan un array de condiciones.
db.products.find({
  category: { $in: ["café", "té"] },
  price:    { $lte: 20000 },
  $or: [
    { stock: { $gt: 0 } },
    { tags:  "premium" }
  ]
})

05Caso 2 · find() Catálogo filtrable

Mueve los filtros de la izquierda y mira la query Mongo construirse en vivo a la derecha. Es exactamente lo que hace cualquier e-commerce moderno: cada filtro es un operador más en el objeto de búsqueda.

Tienda · catálogo filtrable
db.products.find( … ) en vivo
Resultados
8 de 8
snack
Galletas integral
$ 6.000 · stock 4
integral
Té manzanilla
$ 9.500 · stock 30
suaverelajante
Té verde
$ 12.000 · stock 12
suave
despensa
Cacao en polvo
$ 15.000 · stock 11
orgánico
snack
Chocolate amargo
$ 22.000 · stock 8
premiumoscuro
café
Café Huila
$ 28.000 · stock 25
medio
café
Café Tolima
$ 30.000 · stock 0
oscuroorgánico
café
Café Sierra Nevada
$ 32.000 · stock 18
premiumoscuro
Query Mongo construida
db.products.find( {} )
.sort({ price: 1 })
Resultado · 8 documento(s)
"Galletas integral" · $ 6.000 · snack
"Té manzanilla" · $ 9.500 ·
"Té verde" · $ 12.000 ·
"Cacao en polvo" · $ 15.000 · despensa
"Chocolate amargo" · $ 22.000 · snack
"Café Huila" · $ 28.000 · café
"Café Tolima" · $ 30.000 · café
"Café Sierra Nevada" · $ 32.000 · café

06Operadores de update

$set
$set
Cambiar un campo a un valor exacto. Soporta dot-notation: "address.city".
$inc
$inc
Sumar (o restar con valor negativo). Ideal para contadores.
$push
$push / $pull
Añadir o quitar elementos de un array dentro del documento.
$addToSet
$addToSet
Como $push pero evita duplicados — útil para tags, likers, etc.

07Caso 3 · $set Editor de perfil

Aquí lo que importa es dot-notation: para cambiar la ciudad dentro de address, el campo se escribe "address.city". Mongo entiende el camino y solo modifica esa hoja, sin tocar el resto del objeto.

Editor de perfil · usuario u042
$set con dot-notation · $pull / $addToSet
u042
Dirección
Preferencias
Intereses
Documento · users/u042
{
"_id": "u042",
"name": "Ana Restrepo",
"email": "[email protected]",
"age": 27,
"address": {
"city": "Bogotá",
"country": "Colombia",
"zip": "110111"
}
,
"prefs": {
"theme": "light",
"newsletter": true
}
,
"interests": ["café", "lectura"]
}
Últimos comandos
Aún no hay comandos. Interactúa a la izquierda →
No reemplaces el documento entero

Un error común al empezar: updateOne({_id}, { newDoc }) sin $set. Eso reemplaza el documento entero — pierdes campos que no incluiste. Siempre usa los operadores ($set, $inc, $push) cuando quieras editar.

08Embedding vs Referencing

La gran decisión de diseño en Mongo es cuándo anidar y cuándo referenciar. La regla práctica:

  • Embed cuando los datos hijos solo viven con su padre y se leen juntos: comentarios de un post, dirección de un usuario, items dentro de un pedido.
  • Reference (un campo con el _id del otro) cuando los datos son independientes y se comparten: un usuario que aparece como autor en miles de posts no se duplica; guardas { author_id: "u042" }.
  • Hay un límite duro: un documento no puede exceder 16 MB. Si el array crece sin parar, separa.

09Cuándo Mongo, cuándo NO Mongo

Sí, Mongo
Datos cuya forma varía entre registros. Catálogos con atributos heterogéneos. Logs y eventos. Contenido (posts, productos) que se lee mucho más de lo que se cruza. Apps que crecen rápido sin esquema fijo.
No, Mongo
Sistemas con muchas relaciones donde harás cinco JOINs (banca, ERP). Reportes complejos con queries arbitrarias. Cuando la consistencia transaccional es vital (aunque Mongo ya soporta transacciones, no es su fuerte original).
Resumen

Mongo no es "SQL sin esquema". Es un modelo distinto donde tú diseñas los documentos en función de cómo se van a leer. Cuando lo entiendes, escribir CRUD es liberador. Cuando lo fuerzas a parecer una base relacional, sufres. Elige por la forma del problema, no por moda.