Vamos a hacer un ejercicio práctico para entender relación uno a uno (1:1) en MongoDB y además entender cuándo conviene usar documentos embebidos vs referencias.
Vamos a construir un ejemplo real: Usuario → Perfil. Un usuario tiene un solo perfil y un perfil pertenece a un solo usuario.
Entender el concepto de relación 1:1 en MongoDB
En MongoDB normalmente existen dos formas. Veamos un resumen segun la documentacion oficial.
Opción A — Embebido (recomendada cuando siempre se consulta junto)
{
"_id": ObjectId("1"),
"name": "Oscar",
"email": "oscar@test.com",
"profile": {
"bio": "Backend Developer",
"avatar": "avatar.jpg",
"age": 28
}
}
Opción B — Referencia (cuando puede crecer o cambiar independiente)
Usuario
{
"_id": ObjectId("1"),
"name":"Oscar",
"profileId": ObjectId("10")
}
Perfil
{
"_id": ObjectId("10"),
"bio":"Backend Developer"
}
Instalar entorno de trabajo
Ejercicio práctico (usar EMBEDDED)
Este es el enfoque más idiomático en MongoDB.
Paso 1. Crear base
use relacion_uno_uno
Paso 2. Crear colección users
db.createCollection("users")
Verifica:
show collections
Paso 3. Insertar usuario con perfil
db.users.insertOne({
name: "Oscar Fernandez",
email: "oscar@email.com",
profile: {
age: 30,
profession: "Software Engineer",
country: "Colombia",
active: true
}
})
Resultado esperado:
{
"_id": "...",
"name":"Oscar Fernandez",
"email":"oscar@email.com",
"profile":{
"age":30,
"profession":"Software Engineer",
"country":"Colombia",
"active":true
}
}
Paso 4. Consultar
Todos:
db.users.find().pretty()
Solo un campo:
db.users.find(
{},
{
name:1,
profile:1
}
)
Resultado:
{
"name":"Oscar Fernandez",
"profile":{
"age":30,
"profession":"Software Engineer"
}
}
Paso 5. Actualizar solo el perfil
Cambiar profesión:
db.users.updateOne(
{
email:"oscar@email.com"
},
{
$set:{
"profile.profession":"Backend Architect"
}
}
)
Consultar:
db.users.findOne()
Paso 6. Agregar un nuevo atributo
db.users.updateOne(
{},
{
$set:{
"profile.linkedin":"oscar-dev"
}
}
)
Resultado:
"profile":{
"age":30,
"profession":"Backend Architect",
"linkedin":"oscar-dev"
}
Ejercicio con REFERENCIAS
Esto se parece más al mundo SQL.
Crear colecciones
db.createCollection("profiles")
db.createCollection("users")
Insertar perfil
db.profiles.insertOne({
bio:"Desarrollador Java",
age:30
})
Obtener id:
db.profiles.find()
Supongamos:
683001
Insertar usuario
db.users.insertOne({
name:"Oscar",
profileId:ObjectId("683001")
})
Consultar con $lookup
db.users.aggregate([
{
$lookup:{
from:"profiles",
localField:"profileId",
foreignField:"_id",
as:"profile"
}
}
])
Resultado:
{
"name":"Oscar",
"profile":[
{
"bio":"Desarrollador Java",
"age":30
}
]
}
¿Cuándo usar cada uno?
| Escenario | Embebido | Referencia |
|---|---|---|
| Siempre lees junto | ✅ | ❌ |
| Datos pequeños | ✅ | ❌ |
| Actualización independiente | ❌ | ✅ |
| Crecimiento grande | ❌ | ✅ |
| Alto rendimiento lectura | ✅ | ❌ |