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

📅 Esquema de Trabajo por Semanas – Proyecto Final MongoDB

Sistema de Tickets de Soporte Técnico

🟦 Semana 1 — Modelado, creación de BD y carga de datos

Meta de la semana:

Dejar completamente lista la estructura del proyecto: BD, colecciones, validaciones y datos de prueba.

✔ Actividades obligatorias de la Semana 1

1. Crear la base de datos personalizada

bdavanzadas_<apellido>_<matricula>


2. Crear las colecciones principales

- usuarios
- tickets
- comentarios
- autorProyecto (obligatoria)

3. Implementar validadores ($jsonSchema)

Mínimo en dos colecciones, por ejemplo:

- tickets
- usuarios

4. Insertar datos de prueba realistas

- Mínimo:
  - 5 usuarios (clientes/técnicos)
  - 8–12 tickets
  - 10–15 comentarios

5. Capturas que se deben entregar

- show dbs
- use bdavanzadas_apellido_matricula
- Colecciones creadas
- Validadores funcionando
- Insert de los datos de ejemplo
- autorProyecto.find().pretty()

🟩 Semana 2 — Índices, consultas CRUD y búsquedas avanzadas

Meta de la semana:

Construir consultas reales, optimizarlas y demostrar dominio de índices y búsquedas.

✔ Actividades obligatorias de la Semana 2

1. Crear al menos 2 índices obligatorios

- Índice compuesto en tickets:

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


- Índice de texto para búsquedas:

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


2. Realizar consultas CRUD

- Insertar nuevos usuarios/tickets
- Actualizar el estado de un ticket
- Eliminar un comentario específico
- Consultas filtradas:
  - por estado
  - por prioridad
  - por clienteId / tecnicoId

3. Realizar búsquedas de texto

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


4. Capturas que se deben entregar

- Creación de índices
- Consultas CRUD
- Búsquedas de texto
- Resultados correctamente formateados

🟧 Semana 3 — Aggregation, reportes y evidencias finales

Meta de la semana:

Construir reportes mediante pipelines, relacionar datos con $lookup y preparar evidencias anti-plagio.

✔ Actividades obligatorias de la Semana 3

1. Crear mínimo 3 pipelines de Aggregation

Ejemplos:

a) Tickets por estado

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


b) Tickets atendidos por técnico

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


c) $lookup para relacionar usuarios + tickets

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


d) Número de comentarios por ticket

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


2. Crear la función system.js personalizada

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

db.loadServerScripts();
infoProyecto_<matricula>();


3. Preparar el PDF final

Debe incluir:

- Introducción del proyecto
- Modelo de datos (listas o diagrama)
- Capturas semana 1
- Capturas semana 2
- Capturas semana 3
- Conclusión personal
- Evidencias obligatorias:
  - BD personalizada
  - autorProyecto
  - system.js ejecutándose

📅 Esquema de Trabajo por Semanas – Proyecto Final MongoDB

Sistema de Tickets de Soporte Técnico

🟦 Semana 1 — Modelado, creación de BD y carga de datos

Meta de la semana:

Dejar completamente lista la estructura del proyecto: BD, colecciones, validaciones y datos de prueba.

✔ Actividades obligatorias de la Semana 1

1. Crear la base de datos personalizada

bdavanzadas_<apellido>_<matricula>


2. Crear las colecciones principales

- usuarios
- tickets
- comentarios
- autorProyecto (obligatoria)

3. Implementar validadores ($jsonSchema)

Mínimo en dos colecciones, por ejemplo:

- tickets
- usuarios

4. Insertar datos de prueba realistas

- Mínimo:
  - 5 usuarios (clientes/técnicos)
  - 8–12 tickets
  - 10–15 comentarios

5. Capturas que se deben entregar

- show dbs
- use bdavanzadas_apellido_matricula
- Colecciones creadas
- Validadores funcionando
- Insert de los datos de ejemplo
- autorProyecto.find().pretty()

🟩 Semana 2 — Índices, consultas CRUD y búsquedas avanzadas

Meta de la semana:

Construir consultas reales, optimizarlas y demostrar dominio de índices y búsquedas.

✔ Actividades obligatorias de la Semana 2

1. Crear al menos 2 índices obligatorios

- Índice compuesto en tickets:

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


- Índice de texto para búsquedas:

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


2. Realizar consultas CRUD

- Insertar nuevos usuarios/tickets
- Actualizar el estado de un ticket
- Eliminar un comentario específico
- Consultas filtradas:
  - por estado
  - por prioridad
  - por clienteId / tecnicoId

3. Realizar búsquedas de texto

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


4. Capturas que se deben entregar

- Creación de índices
- Consultas CRUD
- Búsquedas de texto
- Resultados correctamente formateados

🟧 Semana 3 — Aggregation, reportes y evidencias finales

Meta de la semana:

Construir reportes mediante pipelines, relacionar datos con $lookup y preparar evidencias anti-plagio.

✔ Actividades obligatorias de la Semana 3

1. Crear mínimo 3 pipelines de Aggregation

Ejemplos:

a) Tickets por estado

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


b) Tickets atendidos por técnico

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


c) $lookup para relacionar usuarios + tickets

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


d) Número de comentarios por ticket

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


2. Crear la función system.js personalizada

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

db.loadServerScripts();
infoProyecto_<matricula>();


3. Preparar el PDF final

Debe incluir:

- Introducción del proyecto
- Modelo de datos (listas o diagrama)
- Capturas semana 1
- Capturas semana 2
- Capturas semana 3
- Conclusión personal
- Evidencias obligatorias:
  - BD personalizada
  - autorProyecto
  - system.js ejecutándose