Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/tutosrive/db-nosql-2026-1/llms.txt

Use this file to discover all available pages before exploring further.

Este taller aborda el diseño de un modelo de datos NoSQL para un sistema de fútbol universitario. Usando MongoDB como motor de base de datos, modelamos cuatro colecciones interrelacionadas —equipos, partidos, usuarios y predicciones— que permiten gestionar torneos internos de la universidad, registrar a los estudiantes participantes y almacenar sus predicciones de resultados en tiempo real.

Objetivo

Diseñar e implementar un modelo de datos NoSQL en MongoDB para un sistema de fútbol universitario que permita:
  • Registrar equipos con sus jugadores, estadísticas y entrenador.
  • Gestionar partidos (matches) entre equipos dentro de diferentes torneos universitarios.
  • Almacenar perfiles de usuarios (estudiantes) con su programa, semestre y tipo de plan.
  • Registrar predicciones de resultado realizadas por los usuarios antes de cada partido.
El sistema debe soportar consultas eficientes sobre el estado de los torneos, los partidos programados y el comportamiento de los usuarios dentro de la plataforma.

Colecciones del Sistema

El sistema está compuesto por cuatro colecciones principales en la base de datos dbfutbol.

usuarios

Estudiantes registrados en la plataforma con su información académica y plan de suscripción.

partidos

Encuentros entre equipos universitarios, organizados por torneo, sede y fecha.

predicciones

Pronósticos de resultado realizados por usuarios antes de cada partido.

equipos

Equipos universitarios con plantilla de jugadores, estadísticas individuales y entrenador.

1. Colección usuarios

Almacena los perfiles de estudiantes registrados en la plataforma. Cada usuario tiene un identificador único, su información académica y un tipo de plan (free o premium) que determina las funcionalidades disponibles. Campos:
CampoTipoDescripción
user_idNumberIdentificador único del usuario
nombreStringNombre completo
aliasStringNombre de usuario en la plataforma
correoStringCorreo institucional
programaStringPrograma académico en la universidad
semestreNumberSemestre actual del estudiante
planStringTipo de suscripción: "free" o "premium"
puntos_acumuladosNumberPuntos obtenidos por predicciones acertadas
Documento de ejemplo:
{
  "user_id": 3,
  "nombre": "Paula Rojas",
  "alias": "projas3",
  "correo": "projas3@uni.edu",
  "programa": "Administración",
  "semestre": 3,
  "plan": "premium",
  "puntos_acumulados": 0
}

2. Colección partidos

Registra cada encuentro futbolístico del sistema universitario. Incluye el torneo al que pertenece, los equipos local y visitante, la sede, el estado del partido y el resultado (cuando está disponible). Campos:
CampoTipoDescripción
match_idNumberIdentificador único del partido
torneoStringNombre del torneo: "Liga Uni", "Interfacultades", "Copa Uni"
fechaStringFecha y hora del partido (formato ISO 8601)
localStringNombre del equipo local
visitanteStringNombre del equipo visitante
estadoStringEstado del partido: "programado", "en juego", "finalizado"
sedeStringLugar donde se juega: "Estadio Central", "Campus Norte", "Campus Sur"
resultadoObject/nullResultado final (null si no ha comenzado)
Documento de ejemplo:
{
  "match_id": 101,
  "torneo": "Liga Uni",
  "fecha": "2026-04-01T18:00:00",
  "local": "Tiburones",
  "visitante": "Pumas",
  "estado": "programado",
  "sede": "Estadio Central",
  "resultado": null
}
Los tres torneos universitarios del sistema son Liga Uni, Interfacultades y Copa Uni. Cada torneo agrupa partidos entre equipos de distintas facultades o categorías de competencia.

3. Colección predicciones

Almacena los pronósticos de resultado que cada usuario registra antes de un partido. Usa el patrón de documento embebido resumido (user_summary, match_summary) para evitar joins costosos en las consultas más frecuentes, manteniendo referencias por user_id y match_id para operaciones completas. Campos:
CampoTipoDescripción
prediction_idNumberIdentificador único de la predicción
user_idNumberReferencia al usuario que realizó la predicción
match_idNumberReferencia al partido predicho
predObjectPredicción: { goles_local, goles_visitante }
fechaStringFecha y hora en que se registró la predicción
estadoStringEstado: "activa", "evaluada", "cancelada"
user_summaryObjectResumen embebido del usuario { alias }
match_summaryObjectResumen embebido del partido { local, visitante, torneo }
puntosNumber/nullPuntos asignados al evaluar el resultado
Documento de ejemplo:
{
  "prediction_id": 9001,
  "user_id": 21,
  "match_id": 118,
  "pred": {
    "goles_local": 3,
    "goles_visitante": 0
  },
  "fecha": "2026-04-16T22:00:00",
  "estado": "activa",
  "user_summary": {
    "alias": "agomez21"
  },
  "match_summary": {
    "local": "Panteras",
    "visitante": "Pumas",
    "torneo": "Copa Uni"
  },
  "puntos": null
}

4. Colección equipos

Contiene los equipos participantes del sistema universitario. Cada documento embebe la plantilla completa de jugadores y las estadísticas individuales de cada uno, siguiendo el modelo de subdocumentos anidados propio de MongoDB. Campos:
CampoTipoDescripción
team_idNumberIdentificador único del equipo
nombreStringNombre del equipo
ciudadStringCiudad y país del equipo
entrenadorObject{ nombre, experiencia_anios }
jugadoresArrayLista de jugadores con estadísticas
Cada jugador en el array jugadores tiene la siguiente estructura:
CampoTipoDescripción
jugador_idNumberIdentificador del jugador
nombreStringNombre completo
posicionStringPosición: Portero, Defensa, Centrocampista, Delantero
dorsalNumberNúmero de camiseta
titularString"si" o "no"
estadisticasObjectGoles, asistencias, tarjetas, tipo de torneo
Documento de ejemplo:
{
  "team_id": 1,
  "nombre": "Real Madrid CF",
  "ciudad": "Madrid, España",
  "entrenador": {
    "nombre": "Carlo Ancelotti",
    "experiencia_anios": 29
  },
  "jugadores": [
    {
      "jugador_id": 1,
      "nombre": "Thibaut Courtois",
      "posicion": "Portero",
      "dorsal": 1,
      "titular": "si",
      "estadisticas": {
        "goles": 0,
        "asistencias": 0,
        "n_rojas": 0,
        "n_amarillas": 1,
        "n_goles_torneo_equipo": 87,
        "tipo_torneo": "La Liga"
      }
    },
    {
      "jugador_id": 5,
      "nombre": "Kylian Mbappé",
      "posicion": "Delantero",
      "dorsal": 9,
      "titular": "si",
      "estadisticas": {
        "goles": 27,
        "asistencias": 7,
        "n_rojas": 0,
        "n_amarillas": 2,
        "n_goles_torneo_equipo": 87,
        "tipo_torneo": "La Liga"
      }
    }
  ]
}

Importar los Datos

Usa mongoimport para cargar los archivos JSON en MongoDB. Asegúrate de tener MongoDB corriendo en tu máquina antes de ejecutar estos comandos.
1

Importar usuarios

mongoimport --db dbfutbol --collection usuarios \
  --file JsonUsers.json --jsonArray
2

Importar partidos

mongoimport --db dbfutbol --collection partidos \
  --file JsonMatches.json --jsonArray
3

Importar predicciones

mongoimport --db dbfutbol --collection predicciones \
  --file JsonPredictions.json --jsonArray
4

Importar equipos

mongoimport --db dbfutbol --collection equipos \
  --file taller1.equipos_t1.json --jsonArray
5

Verificar la importación

use dbfutbol

db.usuarios.countDocuments()
db.partidos.countDocuments()
db.predicciones.countDocuments()
db.equipos.countDocuments()

Consultas Básicas sobre el Sistema

Una vez importados los datos, puedes explorar el sistema con las siguientes consultas en mongosh.

1. Listar todos los partidos programados

Muestra todos los partidos cuyo estado es "programado", ordenados por fecha ascendente.
db.partidos.find(
  { estado: "programado" },
  { _id: 0, match_id: 1, torneo: 1, fecha: 1, local: 1, visitante: 1, sede: 1 }
).sort({ fecha: 1 })

2. Buscar usuarios con plan premium

Retorna todos los estudiantes suscritos al plan "premium", mostrando su nombre, alias, programa y semestre.
db.usuarios.find(
  { plan: "premium" },
  { _id: 0, nombre: 1, alias: 1, programa: 1, semestre: 1 }
)

3. Buscar partidos por torneo

Filtra partidos que pertenecen a un torneo específico. Reemplaza el valor según el torneo que desees consultar: "Liga Uni", "Interfacultades" o "Copa Uni".
db.partidos.find(
  { torneo: "Liga Uni" },
  { _id: 0, match_id: 1, fecha: 1, local: 1, visitante: 1, sede: 1, estado: 1 }
).sort({ fecha: 1 })

4. Buscar partidos por equipo (local o visitante)

Encuentra todos los partidos en los que participa un equipo determinado, ya sea como local o visitante. Usa el operador $or para cubrir ambos casos.
db.partidos.find(
  {
    $or: [
      { local: "Pumas" },
      { visitante: "Pumas" }
    ]
  },
  { _id: 0, match_id: 1, torneo: 1, fecha: 1, local: 1, visitante: 1, estado: 1 }
).sort({ fecha: 1 })

5. Contar usuarios por programa universitario

Usa el pipeline de agregación para agrupar usuarios por su programa académico y contar cuántos hay en cada uno, ordenados de mayor a menor.
db.usuarios.aggregate([
  {
    $group: {
      _id: "$programa",
      total_usuarios: { $sum: 1 }
    }
  },
  { $sort: { total_usuarios: -1 } },
  {
    $project: {
      _id: 0,
      programa: "$_id",
      total_usuarios: 1
    }
  }
])

6. Ver las predicciones activas de un usuario

Consulta todas las predicciones activas de un usuario específico usando su user_id.
db.predicciones.find(
  { user_id: 21, estado: "activa" },
  {
    _id: 0,
    prediction_id: 1,
    "match_summary.torneo": 1,
    "match_summary.local": 1,
    "match_summary.visitante": 1,
    pred: 1,
    fecha: 1
  }
)

7. Contar predicciones por torneo

Agrupa las predicciones por el nombre del torneo para ver cuál genera más actividad en la plataforma.
db.predicciones.aggregate([
  {
    $group: {
      _id: "$match_summary.torneo",
      total_predicciones: { $sum: 1 }
    }
  },
  { $sort: { total_predicciones: -1 } },
  {
    $project: {
      _id: 0,
      torneo: "$_id",
      total_predicciones: 1
    }
  }
])

Relaciones en el Modelo

El modelo utiliza una estrategia híbrida: referencias numéricas (user_id, match_id) para las relaciones principales y subdocumentos embebidos resumidos (user_summary, match_summary) en la colección de predicciones para optimizar las consultas más frecuentes.
usuarios                predicciones               partidos
────────                ────────────               ────────
user_id  ──────────►  user_id                   match_id
nombre                  match_id  ◄──────────    torneo
alias                   pred                     local
correo                  estado                   visitante
programa                user_summary             sede
semestre                  └─ alias               estado
plan                    match_summary            resultado
puntos_acumulados         ├─ local
                          ├─ visitante
                          └─ torneo
Ventajas de este diseño:
  • Lecturas rápidas: user_summary y match_summary permiten mostrar información del usuario y del partido en una predicción sin hacer múltiples consultas.
  • Actualizaciones controladas: Los datos maestros (nombre completo, estadísticas del partido) se actualizan en su colección original; el resumen embebido es solo para visualización.
  • Consistencia referencial lógica: Aunque MongoDB no impone claves foráneas, la convención user_id / match_id establece la trazabilidad entre colecciones.
Para buscar predicciones con información completa del usuario y del partido, puedes usar el operador $lookup en un pipeline de agregación para hacer un “join” entre las colecciones predicciones, usuarios y partidos.

Build docs developers (and LLMs) love