Title: Proyecto Final
Course: 2025 - LISI - Base de Datos Avanzadas 3-3 > Section: Proyecto final

PROYECTO FINAL – Base de Datos Avanzadas

Sistema de Tickets de Soporte en MongoDB

Duración: 3 semanas
Entrega: PDF con evidencias

1) Objetivo

Desarrollar un sistema de tickets de soporte técnico utilizando MongoDB, aplicando modelado avanzado, validación de documentos, índices, agregaciones, y relaciones entre colecciones mediante $lookup.
El objetivo es demostrar dominio real del manejo de datos en MongoDB.

2) Instrucciones Generales

A. Nombre de la Base de Datos (OBLIGATORIO)

La base de datos debe incluir tus datos personales:

bdavanzadas_<apellido>_<matricula>


Ejemplo:

bdavanzadas_sanchez_12345


B. Crear las siguientes colecciones:

1. usuarios

Guarda información de clientes y técnicos.

Campos sugeridos:

{
  _id: ObjectId(),
  nombre: String,
  correo: String,
  rol: "cliente" | "tecnico",
  activo: Boolean,
  creadoEn: Date
}


2. tickets

Guarda los tickets creados por los usuarios.

Campos sugeridos:

{
  _id: ObjectId(),
  titulo: String,
  descripcion: String,
  prioridad: "baja" | "media" | "alta",
  estado: "abierto" | "en_proceso" | "cerrado",
  clienteId: ObjectId,
  tecnicoId: ObjectId,
  creadoEn: Date,
  actualizadoEn: Date,
  etiquetas: [String]
}


3. comentarios

Guarda los comentarios dentro de un ticket.

Campos sugeridos:

{
  _id: ObjectId(),
  ticketId: ObjectId,
  autorId: ObjectId,
  mensaje: String,
  creadoEn: Date
}


4. autorProyecto (OBLIGATORIA)

Esta colección sirve como evidencia de que el proyecto es tuyo.

{
  nombre: "Tu nombre completo",
  matricula: "Tu matrícula",
  grupo: "Tu grupo",
  proyecto: "Sistema de tickets de soporte con MongoDB"
}


C. Validación de Esquemas (Validators)

Debes crear validators en al menos 2 colecciones, por ejemplo tickets y usuarios.

Debes validar:

- tipos de datos
- campos requeridos
- valores permitidos (enum)

Ejemplo:

db.createCollection("tickets", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["titulo", "descripcion", "prioridad", "estado", "clienteId", "creadoEn"],
      properties: {
        prioridad: { enum: ["baja", "media", "alta"] },
        estado: { enum: ["abierto", "en_proceso", "cerrado"] }
      }
    }
  }
})


D. Índices (MÍNIMO 2 tipos diferentes)

1. Índice compuesto en tickets:

db.tickets.createIndex({ estado: 1, prioridad: 1 });


1. Índice de texto para búsquedas:

db.tickets.createIndex({ titulo: "text", descripcion: "text" });


E. Consultas CRUD (OBLIGATORIAS)

Incluir capturas de:

- Insertar usuarios, tickets y comentarios
- Actualizar estado de un ticket
- Borrar un comentario
- Consultas por:
  - estado
  - prioridad
  - clienteId o tecnicoId
- Búsqueda de texto:

db.tickets.find({ $text: { $search: "impresora" } });


F. Pipelines de Aggregation (MÍNIMO 3)

Ejemplos permitidos:

1. Tickets agrupados por estado:

db.tickets.aggregate([
  { $group: { _id: "$estado", total: { $sum: 1 } } }
])


1. Tickets por técnico:

db.tickets.aggregate([
  { $match: { tecnicoId: { $ne: null } } },
  { $group: { _id: "$tecnicoId", totalTickets: { $sum: 1 } } }
])


1. Tickets con datos del cliente usando $lookup:

db.tickets.aggregate([
  {
    $lookup: {
      from: "usuarios",
      localField: "clienteId",
      foreignField: "_id",
      as: "cliente"
    }
  },
  { $unwind: "$cliente" }
])


1. Tickets con número de comentarios:

db.tickets.aggregate([
  {
    $lookup: {
      from: "comentarios",
      localField: "_id",
      foreignField: "ticketId",
      as: "comentarios"
    }
  },
  { $project: { titulo: 1, totalComentarios: { $size: "$comentarios" } } }
])


3) Evidencia para evitar copias

Para que cada proyecto sea único, deberás incluir:

A. Screenshot de tu BD personalizada

show dbs
use bdavanzadas_<apellido>_<matricula>


B. Screenshot de tu colección autorProyecto

db.autorProyecto.find().pretty();


C. Función en system.js con tu nombre

db.system.js.save({
  _id: "infoProyecto_<matricula>",
  value: function() {
    return "Proyecto final BD Avanzadas - <matricula>";
  }
});
db.loadServerScripts();
infoProyecto_<matricula>();


4) Método de Entrega

Subir un PDF que incluya:

1. Portada con nombre, matrícula y grupo
2. Explicación breve del proyecto (1 página máximo)
3. Modelo de datos (lista de colecciones y campos o diagrama)
4. Evidencias de:
  - creación de colecciones
  - validators
  - inserciones
  - actualizaciones
  - eliminaciones
  - índices
  - búsquedas de texto
  - pipelines de aggregation
  - colección autorProyecto
  - ejecución de system.js
5. Conclusión personal (qué aprendiste del proyecto)

5) Fuentes de Información Recomendadas

📘 1. createCollection

- Documentación oficial:
https://www.mongodb.com/docs/manual/reference/command/create/

📘 2. Validadores ($jsonSchema)

- https://www.mongodb.com/docs/manual/core/schema-validation/

📘 3. createIndex

- Índices en general:
https://www.mongodb.com/docs/manual/indexes/
- Índices de texto:
https://www.mongodb.com/docs/manual/core/index-text/

📘 4. aggregate y pipelines

- https://www.mongodb.com/docs/manual/aggregation/
- Operadores de agregación:
https://www.mongodb.com/docs/manual/reference/operator/aggregation/

📘 5. $lookup (relaciones entre colecciones)

- https://www.mongodb.com/docs/manual/reference/operator/aggregation/lookup/

📘 6. Relaciones y modelado en MongoDB

- https://www.mongodb.com/docs/manual/core/data-modeling-introduction/

PROYECTO FINAL – Base de Datos Avanzadas

Sistema de Tickets de Soporte en MongoDB

Duración: 3 semanas
Entrega: PDF con evidencias

1) Objetivo

Desarrollar un sistema de tickets de soporte técnico utilizando MongoDB, aplicando modelado avanzado, validación de documentos, índices, agregaciones, y relaciones entre colecciones mediante $lookup.
El objetivo es demostrar dominio real del manejo de datos en MongoDB.

2) Instrucciones Generales

A. Nombre de la Base de Datos (OBLIGATORIO)

La base de datos debe incluir tus datos personales:

bdavanzadas_<apellido>_<matricula>


Ejemplo:

bdavanzadas_sanchez_12345


B. Crear las siguientes colecciones:

1. usuarios

Guarda información de clientes y técnicos.

Campos sugeridos:

{
  _id: ObjectId(),
  nombre: String,
  correo: String,
  rol: "cliente" | "tecnico",
  activo: Boolean,
  creadoEn: Date
}


2. tickets

Guarda los tickets creados por los usuarios.

Campos sugeridos:

{
  _id: ObjectId(),
  titulo: String,
  descripcion: String,
  prioridad: "baja" | "media" | "alta",
  estado: "abierto" | "en_proceso" | "cerrado",
  clienteId: ObjectId,
  tecnicoId: ObjectId,
  creadoEn: Date,
  actualizadoEn: Date,
  etiquetas: [String]
}


3. comentarios

Guarda los comentarios dentro de un ticket.

Campos sugeridos:

{
  _id: ObjectId(),
  ticketId: ObjectId,
  autorId: ObjectId,
  mensaje: String,
  creadoEn: Date
}


4. autorProyecto (OBLIGATORIA)

Esta colección sirve como evidencia de que el proyecto es tuyo.

{
  nombre: "Tu nombre completo",
  matricula: "Tu matrícula",
  grupo: "Tu grupo",
  proyecto: "Sistema de tickets de soporte con MongoDB"
}


C. Validación de Esquemas (Validators)

Debes crear validators en al menos 2 colecciones, por ejemplo tickets y usuarios.

Debes validar:

- tipos de datos
- campos requeridos
- valores permitidos (enum)

Ejemplo:

db.createCollection("tickets", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["titulo", "descripcion", "prioridad", "estado", "clienteId", "creadoEn"],
      properties: {
        prioridad: { enum: ["baja", "media", "alta"] },
        estado: { enum: ["abierto", "en_proceso", "cerrado"] }
      }
    }
  }
})


D. Índices (MÍNIMO 2 tipos diferentes)

1. Índice compuesto en tickets:

db.tickets.createIndex({ estado: 1, prioridad: 1 });


1. Índice de texto para búsquedas:

db.tickets.createIndex({ titulo: "text", descripcion: "text" });


E. Consultas CRUD (OBLIGATORIAS)

Incluir capturas de:

- Insertar usuarios, tickets y comentarios
- Actualizar estado de un ticket
- Borrar un comentario
- Consultas por:
  - estado
  - prioridad
  - clienteId o tecnicoId
- Búsqueda de texto:

db.tickets.find({ $text: { $search: "impresora" } });


F. Pipelines de Aggregation (MÍNIMO 3)

Ejemplos permitidos:

1. Tickets agrupados por estado:

db.tickets.aggregate([
  { $group: { _id: "$estado", total: { $sum: 1 } } }
])


1. Tickets por técnico:

db.tickets.aggregate([
  { $match: { tecnicoId: { $ne: null } } },
  { $group: { _id: "$tecnicoId", totalTickets: { $sum: 1 } } }
])


1. Tickets con datos del cliente usando $lookup:

db.tickets.aggregate([
  {
    $lookup: {
      from: "usuarios",
      localField: "clienteId",
      foreignField: "_id",
      as: "cliente"
    }
  },
  { $unwind: "$cliente" }
])


1. Tickets con número de comentarios:

db.tickets.aggregate([
  {
    $lookup: {
      from: "comentarios",
      localField: "_id",
      foreignField: "ticketId",
      as: "comentarios"
    }
  },
  { $project: { titulo: 1, totalComentarios: { $size: "$comentarios" } } }
])


3) Evidencia para evitar copias

Para que cada proyecto sea único, deberás incluir:

A. Screenshot de tu BD personalizada

show dbs
use bdavanzadas_<apellido>_<matricula>


B. Screenshot de tu colección autorProyecto

db.autorProyecto.find().pretty();


C. Función en system.js con tu nombre

db.system.js.save({
  _id: "infoProyecto_<matricula>",
  value: function() {
    return "Proyecto final BD Avanzadas - <matricula>";
  }
});
db.loadServerScripts();
infoProyecto_<matricula>();


4) Método de Entrega

Subir un PDF que incluya:

1. Portada con nombre, matrícula y grupo
2. Explicación breve del proyecto (1 página máximo)
3. Modelo de datos (lista de colecciones y campos o diagrama)
4. Evidencias de:
  - creación de colecciones
  - validators
  - inserciones
  - actualizaciones
  - eliminaciones
  - índices
  - búsquedas de texto
  - pipelines de aggregation
  - colección autorProyecto
  - ejecución de system.js
5. Conclusión personal (qué aprendiste del proyecto)

5) Fuentes de Información Recomendadas

📘 1. createCollection

- Documentación oficial:
https://www.mongodb.com/docs/manual/reference/command/create/

📘 2. Validadores ($jsonSchema)

- https://www.mongodb.com/docs/manual/core/schema-validation/

📘 3. createIndex

- Índices en general:
https://www.mongodb.com/docs/manual/indexes/
- Índices de texto:
https://www.mongodb.com/docs/manual/core/index-text/

📘 4. aggregate y pipelines

- https://www.mongodb.com/docs/manual/aggregation/
- Operadores de agregación:
https://www.mongodb.com/docs/manual/reference/operator/aggregation/

📘 5. $lookup (relaciones entre colecciones)

- https://www.mongodb.com/docs/manual/reference/operator/aggregation/lookup/

📘 6. Relaciones y modelado en MongoDB

- https://www.mongodb.com/docs/manual/core/data-modeling-introduction/