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.

El Parcial 1 fue una evaluación práctica grupal (sustenación grupal) realizada aproximadamente el 14 de marzo de 2026, con un valor del 25% de la nota final del curso. Consistió en trabajar con cuatro colecciones de MongoDB que representan una plataforma universitaria de aprendizaje: usuarios, cursos, notas y resultadosIA. El objetivo fue demostrar dominio de consultas, agregaciones y modelado de datos en MongoDB.
Este parcial fue de carácter grupal con sustenación. Cada grupo debía importar las colecciones, escribir y ejecutar las consultas solicitadas, y sustentar sus decisiones de modelado ante el docente. Vale el 25% de la nota del curso.

Las 4 Colecciones

Las cuatro colecciones modelan los datos de una plataforma de notas inteligentes con procesamiento de IA para estudiantes universitarios. A continuación se describe el esquema de cada una con un documento de ejemplo real.

1. usuarios

Contiene la información de los estudiantes registrados en la plataforma. Cada documento representa un usuario con su programa académico, semestre, tipo de plan y puntos acumulados. Campos del esquema:
CampoTipoDescripción
_idObjectIdIdentificador interno de MongoDB ($oid)
user_idNumberIdentificador único del usuario
nombreStringNombre del estudiante
programaStringPrograma académico (ej. Ingeniería de sistemas)
semstreNumberSemestre actual del estudiante (campo tal cual está en los datos)
planStringTipo de plan: "free" o "premium"
Documento de ejemplo:
{
  "_id": { "$oid": "69e3a5cbcce6ece90f8e28b8" },
  "user_id": 1,
  "nombre": "Juan Eduardo",
  "programa": "Ingeniería de sistemas",
  "semstre": 5,
  "plan": "free"
}
Nota: el campo de semestre aparece como semstre (sin la segunda s) en los datos originales. Al hacer consultas, usa exactamente ese nombre de campo.

2. cursos

Registra los cursos disponibles en la plataforma. Cada documento incluye el docente responsable y una referencia embebida con información básica del usuario (estudiante) que tomó el curso. Campos del esquema:
CampoTipoDescripción
_idObjectIdIdentificador interno de MongoDB ($oid)
curso_idNumberIdentificador único del curso
nombrecursoStringNombre del curso
docenteStringNombre del docente que imparte el curso
user_idNumberReferencia al user_id de la colección usuarios
userObjectDatos embebidos del usuario: user_id, nombre, programa
Documento de ejemplo:
{
  "_id": { "$oid": "69e3a6abcce6ece90f8e28ba" },
  "curso_id": 1,
  "nombrecurso": "Bases de datos NoSQL",
  "docente": "Óscar Bedoya",
  "user_id": 1,
  "user": {
    "user_id": 1,
    "nombre": "Juan Eduardo",
    "programa": "Ingeniería de sistemas"
  }
}

3. notas

Almacena las notas creadas por los estudiantes dentro de un curso. Cada nota tiene un comentario embebido, referencias al curso y al usuario, tipo de contenido, estado de procesamiento de IA, y una referencia embebida al resultado generado por la IA. Campos del esquema:
CampoTipoDescripción
_idObjectIdIdentificador interno de MongoDB ($oid)
note_idNumberIdentificador único de la nota
comentarioObjectObjeto embebido con texto (String) y fecha (String)
curso_idNumberReferencia al curso_id de la colección cursos
cursoObjectDatos embebidos del curso: curso_id, nombrecurso, docente
user_idNumberReferencia al user_id de la colección usuarios
userObjectDatos embebidos del usuario: user_id, nombre, programa
tipoStringTipo de nota, ej. "texto"
fecha_creacionStringFecha y hora de creación de la nota
estado_procesamientoStringEstado del procesamiento IA: "listo", "pendiente", etc.
contenidoObjectObjeto con texto (contenido principal de la nota)
resultado_idNumberReferencia al resultado_id de la colección resultadosIA
resultadoObjectDatos embebidos del resultado IA: resultado_id, resumen, lista_tareas
Documento de ejemplo:
{
  "_id": { "$oid": "69e3aaa4cce6ece90f8e28be" },
  "note_id": 1,
  "comentario": {
    "texto": "Nota de ejemplo",
    "fecha": "18-04-2024 10:30 AM"
  },
  "curso_id": 1,
  "curso": {
    "curso_id": 1,
    "nombrecurso": "Bases de datos NoSQL",
    "docente": "Óscar Bedoya"
  },
  "user_id": 1,
  "user": {
    "user_id": 1,
    "nombre": "Juan Eduardo",
    "programa": "Ingeniería de sistemas"
  },
  "tipo": "texto",
  "fecha_creacion": "19-04-2024 11:30 AM",
  "estado_procesamiento": "listo",
  "contenido": {
    "texto": "Esta llave no debería ir, ya existe el resumen :("
  },
  "resultado_id": 1,
  "resultado": {
    "resultado_id": 1,
    "resumen": "Embebido empaqueta, referenciado fuente de verdad",
    "lista_tareas": [
      "Hacer JSON y enviarlo al correo",
      "Resolver ejercicios"
    ]
  }
}

4. resultadosIA

Guarda los resultados generados por la inteligencia artificial para cada nota procesada. Incluye transcripción, resumen, tareas detectadas, conceptos clave, sitios de búsqueda recomendados, preguntas de estudio y fórmulas identificadas. Campos del esquema:
CampoTipoDescripción
_idObjectIdIdentificador interno de MongoDB ($oid)
resultado_idNumberIdentificador único del resultado; referenciado por notas
transcripcionStringTranscripción completa del contenido procesado por la IA
resumenStringResumen breve generado por la IA
lista_tareas_o_acciones_detectadasArrayLista de tareas o acciones detectadas en la nota
lista_de_conceptos_claveArrayConceptos clave identificados por la IA
sitios_de_busquedaArrayURLs de recursos recomendados por la IA para profundizar
preguntas_estudioArrayPreguntas de estudio generadas automáticamente
listas_de_formulasArrayFórmulas matemáticas o técnicas detectadas en el contenido
Documento de ejemplo:
{
  "_id": { "$oid": "69e3a75bcce6ece90f8e28bd" },
  "resultado_id": 1,
  "transcripcion": "El diseño Embebido se utiliza para datos que cambian poco y se consultan poco a diferencia del Referenciado que se usa para datos que cambian mucho y se usa como la fuente de verdad",
  "resumen": "Embebido empaqueta, referenciado fuente de verdad",
  "lista_tareas_o_acciones_detectadas": [
    "Hacer JSON y enviarlo al correo",
    "Resolver ejercicios",
    "ejmplo"
  ],
  "lista_de_conceptos_clave": [
    "nosql",
    "embebido",
    "joins",
    "objects",
    "documentos"
  ],
  "sitios_de_busqueda": [
    "https://www.w3schools.com/mongodb/index.php",
    "https://www.w3schools.com/postgresql/index.php",
    "https://www.youtube.com/channel/UCanMxWvOoiwtjLYm08Bo8QQ"
  ],
  "preguntas_estudio": [
    "¿Por qué NoSQL es más óptimo que SQL?",
    "¿Cuando usar híbrido?"
  ],
  "listas_de_formulas": [
    "(a+b)^2",
    "(a^2)- (b^2)"
  ]
}

Importar las Colecciones

Antes de ejecutar cualquier consulta, importa los cuatro archivos JSON a la base de datos parcial1 con mongoimport. Asegúrate de estar en el directorio donde están los archivos .json.
1

Importar usuarios

mongoimport --db parcial1 --collection usuarios \
  --file parcial1.usuarios.json --jsonArray
2

Importar cursos

mongoimport --db parcial1 --collection cursos \
  --file parcial1.cursos.json --jsonArray
3

Importar notas

mongoimport --db parcial1 --collection notas \
  --file parcial1.notas.json --jsonArray
4

Importar resultadosIA

mongoimport --db parcial1 --collection resultadosIA \
  --file parcial1.resultadosIA.json --jsonArray
5

Verificar la importación

Conecta con mongosh y verifica que las colecciones existen:
use parcial1
show collections
// Salida esperada:
// cursos
// notas
// resultadosIA
// usuarios

Relaciones entre Colecciones

El modelo de datos combina referencias (campos numéricos como user_id, curso_id, resultado_id) con datos embebidos (objetos user, curso, resultado dentro de otros documentos). Esta es una característica central del modelado NoSQL que se evaluó en el parcial.

cursos → usuarios

cursos.user_id referencia a usuarios.user_id. Adicionalmente, cursos.user contiene datos embebidos del usuario (nombre, programa) para consultas rápidas sin $lookup.

notas → cursos

notas.curso_id referencia a cursos.curso_id. El objeto embebido notas.curso incluye nombre del curso y docente.

notas → usuarios

notas.user_id referencia a usuarios.user_id. El objeto embebido notas.user incluye nombre y programa del estudiante.

notas → resultadosIA

notas.resultado_id referencia a resultadosIA.resultado_id. El objeto embebido notas.resultado incluye el resumen y la lista de tareas generados por la IA.

Diagrama de relaciones

usuarios (user_id)

    └── cursos (user_id → usuarios.user_id)

              └── notas (curso_id → cursos.curso_id)
                        └── (resultado_id → resultadosIA.resultado_id)

                              resultadosIA

$lookup: unir cursos con usuarios

Cuando se necesita información completa del usuario sin depender del objeto embebido, se puede usar $lookup:
db.cursos.aggregate([
  {
    $lookup: {
      from: "usuarios",
      localField: "user_id",
      foreignField: "user_id",
      as: "datos_usuario"
    }
  },
  { $limit: 5 }
])

$lookup: unir notas con resultadosIA

db.notas.aggregate([
  {
    $lookup: {
      from: "resultadosIA",
      localField: "resultado_id",
      foreignField: "resultado_id",
      as: "resultado_completo"
    }
  },
  { $project: { note_id: 1, "comentario.texto": 1, "resultado_completo.resumen": 1 } }
])

Consultas de Referencia

Consultas básicas para explorar y filtrar los datos del parcial.
Antes de escribir cualquier consulta, ejecuta db.coleccion.findOne({}) para inspeccionar la estructura real del primer documento. Esto evita errores por nombres de campo incorrectos.

1. Listar todos los cursos con su docente

db.cursos.find({}, { _id: 0, nombrecurso: 1, docente: 1 })

2. Buscar notas por curso

db.notas.find({ curso_id: 1 })

3. Usuarios con plan premium

db.usuarios.find(
  { plan: "premium" },
  { nombre: 1, programa: 1, semstre: 1, _id: 0 }
)

4. Contar notas por curso (agregación)

db.notas.aggregate([
  { $group: { _id: "$curso_id", total_notas: { $sum: 1 } } },
  { $sort: { total_notas: -1 } }
])

5. Contar usuarios por programa

db.usuarios.aggregate([
  { $group: { _id: "$programa", total: { $sum: 1 } } },
  { $sort: { total: -1 } }
])

6. Buscar cursos de un usuario específico

db.cursos.find({ user_id: 1 })

Consultas Avanzadas

Agregaciones más complejas que combinan múltiples etapas del pipeline.

1. Usuarios por programa con conteo y semestre promedio

db.usuarios.aggregate([
  {
    $group: {
      _id: "$programa",
      total_usuarios: { $sum: 1 },
      semestre_promedio: { $avg: "$semstre" }
    }
  },
  { $sort: { total_usuarios: -1 } }
])

2. Usuarios por semestre y plan

db.usuarios.aggregate([
  {
    $group: {
      _id: { semestre: "$semstre", plan: "$plan" },
      total: { $sum: 1 }
    }
  },
  { $sort: { "_id.semestre": 1 } }
])

3. Notas con estado de procesamiento listo y su resumen IA

db.notas.find(
  { estado_procesamiento: "listo" },
  { _id: 0, note_id: 1, "comentario.texto": 1, "resultado.resumen": 1 }
)

4. Conceptos clave más frecuentes en resultadosIA

db.resultadosIA.aggregate([
  { $unwind: "$lista_de_conceptos_clave" },
  {
    $group: {
      _id: "$lista_de_conceptos_clave",
      frecuencia: { $sum: 1 }
    }
  },
  { $sort: { frecuencia: -1 } }
])

5. Pipeline completo: notas con datos del usuario y resultado IA

db.notas.aggregate([
  {
    $lookup: {
      from: "usuarios",
      localField: "user_id",
      foreignField: "user_id",
      as: "info_usuario"
    }
  },
  {
    $lookup: {
      from: "resultadosIA",
      localField: "resultado_id",
      foreignField: "resultado_id",
      as: "info_resultado"
    }
  },
  {
    $project: {
      note_id: 1,
      "comentario.texto": 1,
      "info_usuario.nombre": 1,
      "info_usuario.programa": 1,
      "info_resultado.resumen": 1,
      "info_resultado.lista_de_conceptos_clave": 1
    }
  }
])

Consejos para el Parcial

Usa findOne({}) para ver el primer documento con todos sus campos y tipos:
db.usuarios.findOne({})
db.cursos.findOne({})
db.notas.findOne({})
db.resultadosIA.findOne({})
Esto es especialmente útil para confirmar nombres de campos antes de escribir consultas (por ejemplo, el campo semstre en usuarios tiene un error tipográfico que viene desde los datos originales).
Tienes dos opciones:
// Conteo exacto (recomendado para consultas con filtros)
db.usuarios.countDocuments()
db.notas.countDocuments({ estado_procesamiento: "listo" })

// Estimación rápida basada en metadatos
db.cursos.estimatedDocumentCount()
Usa countDocuments() cuando necesites un conteo preciso o con filtros, y estimatedDocumentCount() solo para verificaciones rápidas sin filtro.
Usa distinct() para obtener un arreglo con todos los valores únicos de un campo:
// Ver todos los programas registrados
db.usuarios.distinct("programa")

// Ver todos los planes disponibles
db.usuarios.distinct("plan")

// Ver todos los docentes en cursos
db.cursos.distinct("docente")

// Ver todos los estados de procesamiento
db.notas.distinct("estado_procesamiento")
Usa la notación de punto ("objeto.campo") para filtrar o proyectar campos dentro de subdocumentos:
// Filtrar por texto del comentario
db.notas.find({ "comentario.texto": "Nota de ejemplo" })

// Proyectar solo el resumen del resultado embebido
db.notas.find({}, { "resultado.resumen": 1, _id: 0 })

// Filtrar notas de un programa específico (campo embebido)
db.notas.find({ "user.programa": "Ingeniería de sistemas" })
Usa operadores lógicos de MongoDB para combinar condiciones:
// Usuarios premium en semestre 4 o superior
db.usuarios.find({
  plan: "premium",
  semstre: { $gte: 4 }
})

// Notas listas del curso 1
db.notas.find({
  $and: [
    { curso_id: 1 },
    { estado_procesamiento: "listo" }
  ]
})

// Notas de tipo texto o con resultado listo
db.notas.find({
  $or: [
    { tipo: "texto" },
    { estado_procesamiento: "listo" }
  ]
})
Recuerda que el campo de semestre en la colección usuarios está escrito como semstre (sin la segunda s) en los datos del parcial. Usa ese nombre exacto en todas tus consultas o de lo contrario obtendrás resultados vacíos.

Build docs developers (and LLMs) love