Relación 1 a 1 en mongodb


Aprende de la relación 1 a 1 en mongodb y cuando usar relaciones embebidas o referenciales

oscar Escrito por oscar 04 July 2026 5 0

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.

Relación 1 a 1 en mongodb
Relación 1 a 1 en mongodb

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

Comentario

Debe aceptar antes de enviar