Categoría: Bases de Datos

  • MongoDB — El Ministerio de las Promesas Imposibles

    MongoDB — El Ministerio de las Promesas Imposibles

    1. Presentación de la práctica

    Bienvenidos al Ministerio de las Promesas Imposibles, una institución ficticia donde los políticos registran sus promesas electorales y el presupuesto necesario para cumplirlas.

    El problema es que el Ministerio ha perdido el control de sus datos. Hay promesas que se repiten, presupuestos disparatados, proyectos que nadie recuerda haber aprobado y políticos que llevan años prometiendo lo mismo.

    El Gobierno ha decidido contratar a un grupo de administradores de sistemas para modernizar la base de datos.

    Vuestra misión será construir y gestionar esa base de datos utilizando MongoDB.

    A lo largo de la práctica aprenderéis a crear documentos, consultar información, modificar promesas incumplidas y eliminar registros obsoletos.

    Todo ello mediante la terminal y sin necesidad de desarrollar una aplicación web.

    Objetivos de aprendizaje

    Al finalizar, el alumno deberá ser capaz de:

    • Comprender qué es MongoDB y en qué se diferencia de MySQL.
    • Crear y administrar una base de datos NoSQL.
    • Comprender las colecciones y los documentos JSON/BSON.
    • Insertar uno o varios documentos.
    • Realizar consultas con filtros y operadores.
    • Modificar documentos existentes.
    • Eliminar registros.
    • Realizar consultas sencillas de ordenación y estadísticas.
    • Comprender el significado de CRUD.

    2. ¿Qué es MongoDB?

    MongoDB es una base de datos NoSQL orientada a documentos.

    En una base de datos tradicional como MySQL almacenamos información en tablas formadas por filas y columnas. En MongoDB trabajamos con colecciones de documentos que tienen una estructura similar a JSON.

    MySQLTablas y filas

    MongoDBColecciones y documentos

    MySQLMongoDB
    Base de datosBase de datos
    TablaColección
    FilaDocumento
    ColumnaCampo
    Clave primaria_id
    SQLAPI de consultas MongoDB

    Por ejemplo, una promesa política podría almacenarse así:

    
    {
      "politico": "Pepe Promesas",
      "partido": "Partido del Unicornio",
      "promesa": "WiFi gratis hasta en los ascensores",
      "presupuesto": 250000,
      "cumplida": false,
      "etiquetas": ["tecnologia", "internet"]
    }
    

    Observad que tenemos cadenas de texto, números, valores booleanos y arrays dentro de un mismo documento.

    MongoDB almacena los documentos internamente en BSON, una representación binaria que admite tipos adicionales a los de JSON.

    3. Preparación del laboratorio

    Utilizaremos Docker para no tener que instalar directamente el servidor MongoDB en cada máquina virtual.

    Los comandos funcionarán en Linux y también en Windows desde PowerShell, siempre que Docker esté instalado y en ejecución.

    Paso 1. Comprobar Docker

    Abrimos la terminal y ejecutamos:

    
    docker --version
    docker ps
    

    Si Docker está funcionando, podremos consultar la versión y los contenedores activos.

    Paso 2. Descargar MongoDB

    
    docker pull mongo:8.0
    

    Usaremos la imagen oficial de MongoDB 8.0, evitando que una actualización automática de latest cambie la versión durante la práctica.

    Paso 3. Crear nuestro contenedor

    
    docker run -d \
      --name ministerio-mongo \
      -v ministerio_datos:/data/db \
      mongo:8.0
    

    En este comando:

    • -d ejecuta el contenedor en segundo plano.
    • --name identifica nuestro contenedor.
    • -v crea un volumen persistente para almacenar la base de datos.
    • mongo:8.0 es la imagen que estamos utilizando.

    Para esta práctica accederemos a MongoDB directamente desde dentro del contenedor. No necesitamos publicar el puerto 27017 ni dejar la base de datos accesible desde la red.

    Importante: el servidor se utiliza sin autenticación únicamente dentro de este laboratorio aislado. No es una configuración adecuada para producción.

    Paso 4. Comprobar el funcionamiento

    
    docker ps
    

    Deberíamos observar un contenedor llamado ministerio-mongo en estado Up.

    Paso 5. Entrar en MongoDB

    
    docker exec -it ministerio-mongo mongosh
    

    Se abrirá la consola interactiva de MongoDB, llamada mongosh.

    A partir de ahora, los comandos que escribamos dentro de ella son instrucciones de MongoDB, no comandos Bash.

    Podemos comprobar la conexión:

    
    db.runCommand({ ping: 1 })
    

    El resultado debería incluir:

    
    { "ok": 1 }
    

    Referencia: Documentación de la imagen oficial de MongoDB. Docker Hub+1

    4. Crear nuestra primera base de datos

    El Ministerio necesita una base de datos donde registrar sus promesas.

    Escribimos dentro de mongosh:

    
    use ministerio
    

    Podemos comprobar qué base de datos estamos utilizando:

    
    db.getName()
    

    Resultado:

    ministerio

    Ahora creamos una colección llamada promesas.

    
    db.createCollection("promesas")
    

    Comprobamos las colecciones:

    
    show collections
    

    Y para visualizar las bases de datos que realmente tienen datos almacenados:

    
    show dbs
    

    Concepto importante: en MongoDB, seleccionar una base de datos con use no significa que ya esté creada físicamente. Se materializa cuando almacenamos información, como al crear nuestra primera colección.

    5. CREATE — Insertar documentos

    Primera operación CRUD: CREATE

    El Ministro de Transformación Digital, Pepe Promesas, ha anunciado su primera medida electoral:

    *«Todos los ciudadanos tendrán WiFi gratuito, incluso en los ascensores y en las cuevas». *

    Necesitamos registrar esta promesa en nuestra base de datos.

    Paso 1. Insertar un documento

    
    db.promesas.insertOne({
      politico: "Pepe Promesas",
      partido: "Partido del Unicornio",
      promesa: "WiFi gratis hasta en los ascensores",
      categoria: "Tecnologia",
      presupuesto: 250000,
      votos: 1200,
      cumplida: false
    })
    

    El resultado mostrará una confirmación similar a esta:

    {
      acknowledged: true,
      insertedId: ObjectId('...')
    }

    El campo insertedId contiene el identificador único asignado al documento.

    MongoDB genera automáticamente _id cuando no proporcionamos uno.

    Paso 2. Insertar varios documentos

    El Ministerio acaba de celebrar una reunión extraordinaria. Como era de esperar, han aparecido numerosas promesas nuevas.

    Vamos a introducirlas todas de golpe.

    
    db.promesas.insertMany([
      {
        politico: "Lola Subsidios",
        partido: "Union del Bocadillo",
        promesa: "Bocadillos gratis todos los viernes",
        categoria: "Alimentacion",
        presupuesto: 800000,
        votos: 4500,
        cumplida: false
      },
      {
        politico: "Paco Impuestos",
        partido: "Partido del Unicornio",
        promesa: "Eliminar todos los impuestos los lunes",
        categoria: "Economia",
        presupuesto: 5000000,
        votos: 9000,
        cumplida: false
      },
      {
        politico: "Rosa Aeropuertos",
        partido: "Frente de las Rotondas",
        promesa: "Construir un aeropuerto en cada pueblo",
        categoria: "Infraestructuras",
        presupuesto: 15000000,
        votos: 3200,
        cumplida: false
      },
      {
        politico: "Manolo Digital",
        partido: "Union del Bocadillo",
        promesa: "Sustituir funcionarios por robots",
        categoria: "Tecnologia",
        presupuesto: 3000000,
        votos: 11000,
        cumplida: true
      },
      {
        politico: "Carmen Futuro",
        partido: "Frente de las Rotondas",
        promesa: "Construir un carril bici hasta la Luna",
        categoria: "Infraestructuras",
        presupuesto: 50000000,
        votos: 1500,
        cumplida: false
      },
      {
        politico: "Toni Fiestas",
        partido: "Partido del Unicornio",
        promesa: "Declarar los lunes festivos",
        categoria: "Trabajo",
        presupuesto: 2000000,
        votos: 18000,
        cumplida: true
      },
      {
        politico: "Susana Pantallas",
        partido: "Union del Bocadillo",
        promesa: "Una pantalla gigante en cada rotonda",
        categoria: "Tecnologia",
        presupuesto: 650000,
        votos: 2700,
        cumplida: false
      }
    ])
    

    Ya tenemos ocho promesas electorales registradas, contando la primera.

    Paso 3. Contar los documentos

    
    db.promesas.countDocuments({})
    

    Resultado esperado:

    8

    Comprueba que lo has entendido

    ¿Qué diferencia existe entre insertOne() e insertMany()? ¿Qué ocurre si ejecutamos dos veces la misma inserción sin especificar un identificador?

    La segunda inserción generaría nuevos documentos con identificadores diferentes, creando registros duplicados en cuanto a contenido.

    6. READ — Consultar documentos

    Segunda operación CRUD: READ

    El Ministerio necesita consultar sus promesas. Los políticos empiezan a preguntar qué habían prometido durante la campaña.

    Paso 1. Mostrar todas las promesas

    
    db.promesas.find()
    

    El método find() devuelve los documentos de una colección.

    También podemos utilizar:

    
    db.promesas.find().toArray()
    

    Esto permite ver los resultados materializados como un array en la consola, algo cómodo para conjuntos pequeños.

    Paso 2. Buscar un político concreto

    Queremos saber qué prometió Paco Impuestos:

    
    db.promesas.find({
      politico: "Paco Impuestos"
    })
    

    El resultado será el documento correspondiente a Paco.

    Paso 3. Buscar promesas incumplidas

    
    db.promesas.find({
      cumplida: false
    })
    

    Deberían aparecer seis promesas.

    Ahora buscamos las cumplidas:

    
    db.promesas.find({
      cumplida: true
    })
    

    Deberían aparecer dos.

    Paso 4. Consultar por presupuestos

    El Tribunal de Cuentas ha solicitado todas las promesas cuyo presupuesto supera un millón de euros.

    Utilizaremos el operador $gt, que significa greater than (mayor que).

    
    db.promesas.find({
      presupuesto: { $gt: 1000000 }
    })
    

    Otros operadores importantes:

    OperadorSignificado
    $gtMayor que
    $gteMayor o igual que
    $ltMenor que
    $lteMenor o igual que
    $eqIgual que
    $neDistinto de
    $inIncluido en una lista

    Paso 5. Combinar condiciones

    Queremos conocer las promesas de tecnología que siguen incumplidas.

    
    db.promesas.find({
      categoria: "Tecnologia",
      cumplida: false
    })
    

    Cuando incluimos varias condiciones en un mismo filtro, MongoDB aplica un AND implícito.

    En este caso aparecerán las promesas de Pepe Promesas y Susana Pantallas.

    Paso 6. Utilizar OR

    El Ministerio quiere localizar las promesas que pertenezcan a las categorías de Economía o Trabajo.

    
    db.promesas.find({
      $or: [
        { categoria: "Economia" },
        { categoria: "Trabajo" }
      ]
    })
    

    Paso 7. Mostrar solamente algunos campos

    No siempre necesitamos visualizar todos los campos de cada documento.

    Queremos mostrar solamente el nombre del político, su promesa y el presupuesto.

    
    db.promesas.find(
      {},
      {
        _id: 0,
        politico: 1,
        promesa: 1,
        presupuesto: 1
      }
    )
    

    El 1 indica que queremos incluir un campo. El 0 indica que deseamos excluirlo.

    En este ejemplo también ocultamos _id, que se muestra por defecto.

    Paso 8. Ordenar los resultados

    Queremos descubrir cuáles son las promesas más caras.

    
    db.promesas.find(
      {},
      { _id: 0, politico: 1, presupuesto: 1 }
    ).sort({ presupuesto: -1 })
    

    En la ordenación:

    • 1 significa ascendente.
    • -1 significa descendente.

    Paso 9. Limitar resultados

    El Ministerio solamente quiere las tres promesas más caras.

    
    db.promesas.find(
      {},
      { _id: 0, politico: 1, presupuesto: 1 }
    ).sort({ presupuesto: -1 }).limit(3)
    

    El resultado esperado es:

    PolíticoPresupuesto
    Carmen Futuro50.000.000 €
    Rosa Aeropuertos15.000.000 €
    Paco Impuestos5.000.000 €

    7. UPDATE — Modificar documentos

    Tercera operación CRUD: UPDATE

    Han pasado varios meses y el Ministerio necesita actualizar la situación de sus promesas.

    Paso 1. Modificar un documento

    Pepe Promesas asegura que el WiFi ya funciona en todos los ascensores.

    Aunque nadie lo ha podido comprobar, el Ministerio decide marcar la promesa como cumplida.

    
    db.promesas.updateOne(
      { politico: "Pepe Promesas" },
      { $set: { cumplida: true } }
    )
    

    El operador $set permite cambiar uno o varios campos.

    La respuesta habitual incluye:

    matchedCount: 1
    modifiedCount: 1

    matchedCount indica cuántos documentos coincidieron con el filtro, y modifiedCount cuántos fueron modificados.

    Para comprobarlo:

    
    db.promesas.findOne({
      politico: "Pepe Promesas"
    })
    

    Paso 2. Modificar varios campos

    El Gobierno descubre que el carril bici lunar tendrá un coste mayor del previsto.

    
    db.promesas.updateOne(
      { politico: "Carmen Futuro" },
      {
        $set: {
          presupuesto: 75000000,
          cumplida: false
        }
      }
    )
    

    Paso 3. Incrementar un valor numérico

    Durante una manifestación política, Paco Impuestos ha ganado 500 votos adicionales.

    En lugar de consultar los votos actuales y escribir el nuevo total, utilizamos $inc.

    
    db.promesas.updateOne(
      { politico: "Paco Impuestos" },
      { $inc: { votos: 500 } }
    )
    

    Si tenía 9.000 votos, ahora tendrá 9.500.

    También podemos restar:

    
    db.promesas.updateOne(
      { politico: "Paco Impuestos" },
      { $inc: { votos: -200 } }
    )
    

    Ahora tendrá 9.300.

    Paso 4. Actualizar varios documentos

    El Ministerio decide incrementar en un 10 % el presupuesto de todas las promesas tecnológicas.

    
    db.promesas.updateMany(
      { categoria: "Tecnologia" },
      { $mul: { presupuesto: 1.10 } }
    )
    

    updateMany() modifica todos los documentos que cumplan la condición. $mul multiplica el valor numérico por el factor indicado.

    Paso 5. Incorporar un campo nuevo

    El Ministerio ha creado un departamento de excusas.

    Ahora cada promesa necesita un campo llamado excusa.

    
    db.promesas.updateOne(
      { politico: "Rosa Aeropuertos" },
      {
        $set: {
          excusa: "No encontramos suficientes pilotos"
        }
      }
    )
    

    Este campo no existía anteriormente en el documento. MongoDB permite añadirlo sin alterar los demás documentos de la colección.

    Este ejemplo ilustra una de las características de MongoDB: su modelo flexible de documentos.

    8. DELETE — Eliminar documentos

    Cuarta operación CRUD: DELETE

    Tras una auditoría interna, el Ministerio decide eliminar algunas promesas de su registro.

    Paso 1. Eliminar una promesa

    Se ha decidido cancelar el proyecto de las pantallas en las rotondas.

    
    db.promesas.deleteOne({
      politico: "Susana Pantallas"
    })
    

    El resultado esperado incluye:

    deletedCount: 1

    Comprobamos que ha desaparecido:

    
    db.promesas.find({
      politico: "Susana Pantallas"
    })
    

    No debería devolver ningún documento.

    Paso 2. Eliminar varios documentos

    El Ministerio ha decidido eliminar todas las promesas con presupuestos inferiores a 300.000 €.

    Primero consultaremos los documentos afectados:

    
    db.promesas.find({
      presupuesto: { $lt: 300000 }
    })
    

    En este punto de nuestra práctica, la única promesa que cumple esa condición es la de Pepe Promesas, cuyo presupuesto se incrementó hasta 275.000 €.

    Ahora sí, ejecutamos:

    
    db.promesas.deleteMany({
      presupuesto: { $lt: 300000 }
    })
    

    Advertencia: una operación deleteMany({}) sin filtros eliminaría todos los documentos de la colección. Debemos comprobar siempre la condición antes de ejecutarla.

    Paso 3. Comprobar el resultado

    
    db.promesas.countDocuments({})
    

    Si hemos seguido todos los pasos en orden, tendremos seis documentos.

    9. Resumen visual de CRUD

    10. Consultas adicionales — El escándalo de los presupuestos

    Hasta ahora hemos aprendido las cuatro operaciones fundamentales. Pero MongoDB también permite realizar operaciones de análisis.

    El Ministerio quiere conocer algunos datos estadísticos sobre sus promesas.

    ¿Cuánto dinero ha prometido el Gobierno?

    Utilizaremos una operación de agregación:

    
    db.promesas.aggregate([
      {
        $group: {
          _id: null,
          presupuestoTotal: { $sum: "$presupuesto" }
        }
      }
    ])
    

    $group agrupa documentos y $sum suma los valores del campo indicado.

    ¿Cuántas promesas tiene cada partido?

    
    db.promesas.aggregate([
      {
        $group: {
          _id: "$partido",
          totalPromesas: { $sum: 1 }
        }
      },
      {
        $sort: { totalPromesas: -1 }
      }
    ])
    

    Esto es una introducción a las aggregation pipelines. No necesitamos profundizar en ellas todavía, pero sí comprender que MongoDB puede hacer algo más que buscar documentos.

    11. Reto individual — La campaña electoral del alumno

    Misión: Operación Elecciones 404

    Actividad autónoma · 30–40 minutos · Sin soluciones

    El Ministerio ha decidido convocar nuevas elecciones. Cada alumno deberá crear su propio partido político ficticio y registrar sus promesas absurdas utilizando MongoDB.

    Primera parte: creación del partido

    El alumno debe crear una nueva colección llamada elecciones.

    En ella registrará al menos cinco promesas inventadas por él. Cada documento deberá contener:

    • Nombre del político.
    • Partido político.
    • Promesa electoral.
    • Categoría.
    • Presupuesto.
    • Número de votos.
    • Estado de cumplimiento.
    • Un campo adicional de su elección.

    Los nombres y promesas deben ser ficticios y utilizar el humor o la sátira.

    Segunda parte: operaciones obligatorias

    Lista de comprobación

    0 de 13Crear la colección elecciones.Insertar cinco promesas con insertMany().Mostrar todas las promesas.Buscar las promesas de un partido concreto.Encontrar las promesas cuyo presupuesto supere 1.000.000 €.Mostrar solamente los campos político, promesa y presupuesto.Ordenar las promesas de mayor a menor presupuesto.Mostrar únicamente las dos promesas más votadas.Modificar una promesa para marcarla como cumplida.Incrementar los votos de un político en 1.000.Añadir un campo llamado excusa a un documento.Eliminar una promesa utilizando deleteOne().Mostrar cuántos documentos quedan en la colección.

    Reiniciar comprobación

    Tercera parte: reto adicional

    Los alumnos que terminen antes podrán intentar tres operaciones más sin recibir los comandos directamente:

    1. Calcular el presupuesto total de todas las promesas.
    2. Averiguar qué partido tiene más promesas registradas.
    3. Mostrar únicamente las promesas incumplidas y ordenarlas por número de votos.

    12. Entrega del trabajo

    El alumno deberá preparar un archivo README.md que incluya una breve explicación de la práctica, los comandos utilizados y las capturas de las operaciones principales.

    No es necesario entregar una aplicación web. El objetivo es demostrar que sabe trabajar directamente con MongoDB desde la consola.

    Criterios de evaluación

    ApartadoPuntos
    Creación de BD y colecciones1
    Inserción de documentos2
    Consultas y filtros3
    Actualización de documentos2
    Eliminación de documentos1
    Documentación y explicaciones1
    Total10

    13. Cierre y limpieza del laboratorio

    Para salir de la consola de MongoDB:

    
    exit
    

    Ya en la terminal Linux o PowerShell, podemos detener el contenedor:

    
    docker stop ministerio-mongo
    

    Para volver a utilizarlo otro día:

    
    docker start ministerio-mongo
    docker exec -it ministerio-mongo mongosh
    

    Gracias al volumen ministerio_datos, nuestra información seguirá almacenada aunque detengamos el contenedor.

    Si queremos eliminar el contenedor al terminar:

    
    docker rm -f ministerio-mongo
    

    El volumen seguirá existiendo. Para eliminar también todos los datos, de forma irreversible:

    
    docker volume rm ministerio_datos
    

    14. Preguntas finales para reflexionar

    Antes de entregar, cada alumno deberá contestar brevemente:

    1. ¿Qué diferencia existe entre una tabla de MySQL y una colección de MongoDB?
    2. ¿Para qué sirve el campo _id?
    3. ¿Qué diferencia hay entre find() y findOne()?
    4. ¿Cuándo utilizarías updateOne() en lugar de updateMany()?
    5. ¿Qué ocurriría si ejecutases deleteMany({})?
    6. ¿Por qué puede resultar útil que dos documentos de una colección tengan campos diferentes?
    7. ¿Para qué nos sirve utilizar un volumen Docker en esta práctica?
  • 1. Introducción a MongoDB

    1. Introducción a MongoDB

    1. ¿Qué es MongoDB?

    MongoDB es una base de datos NoSQL orientada a documentos.
    Características principales:

    • Guarda la información en documentos JSON (llamados BSON internamente).
    • No usa tablas ni filas como en SQL.
    • Es flexible: cada documento puede tener campos distintos.
    • Escalable y ampliamente usado en desarrollo web.

    Ejemplo de documento en MongoDB:

    {
      "nombre": "Pedro",
      "edad": 23,
      "ciudad": "Madrid"
    }
    

    2. Instalación en Ubuntu/Debian

    2.1. Actualizar el sistema

    sudo apt update && sudo apt upgrade -y
    

    2.2. Instalar MongoDB desde repositorios oficiales (recomendado)

    1. Importar la clave GPG:
    curl -fsSL https://pgp.mongodb.com/server-7.0.asc | \
    sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor
    
    1. Añadir el repositorio:
    echo "deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg] \
    https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | \
    sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
    

    1. Instalar MongoDB:
    sudo apt update
    sudo apt install -y mongodb-org
    

    3. Iniciar, detener y habilitar el servicio

    MongoDB se gestiona con systemctl:

    • Iniciar:
    sudo systemctl start mongod
    
    • Detener:
    sudo systemctl stop mongod
    
    • Reiniciar:
    sudo systemctl restart mongod
    
    • Ver estado:
    sudo systemctl status mongod
    
    • Habilitar al arranque:
    sudo systemctl enable mongod
    

    Comprobar que funciona:

    mongosh
    

    Si aparece el prompt test>, está funcionando correctamente.


    4. Acceso a la Consola de MongoDB (mongosh)

    La herramienta principal para trabajar con MongoDB por consola es:

    mongosh
    

    Al entrar, verás un prompt similar a:

    test>
    

    test es la base de datos por defecto.


    5. Comandos básicos

    5.1. Mostrar bases de datos

    show dbs
    

    5.2. Cambiar o crear una base de datos

    use tienda
    

    Si no existe, MongoDB la creará al guardar datos.

    5.3. Ver colecciones

    Una colección es equivalente a una tabla en SQL.

    show collections
    

    5.4. Insertar documentos

    Ejemplo:

    db.clientes.insertOne({ nombre: "Ana", edad: 25, ciudad: "Sevilla" })
    

    o varios a la vez:

    db.clientes.insertMany([
      { nombre: "Luis", edad: 30 },
      { nombre: "María", edad: 27 }
    ])
    

    5.5. Consultas (búsquedas)

    Mostrar todos:

    db.clientes.find()
    

    Filtrar:

    db.clientes.find({ edad: { $gt: 25 } })
    

    5.6. Actualizar documentos

    Modificar un campo:

    db.clientes.updateOne(
      { nombre: "Ana" },
      { $set: { ciudad: "Granada" } }
    )
    

    5.7. Borrar documentos

    Borrar uno:

    db.clientes.deleteOne({ nombre: "Luis" })
    

    Borrar varios:

    db.clientes.deleteMany({ edad: { $lt: 28 } })
    

    5.8. Borrar una colección entera

    db.clientes.drop()
    

    5.9. Borrar una base de datos

    Primero entrar en ella:

    use tienda
    

    Luego eliminarla:

    db.dropDatabase()
    

    6. Estructura conceptual

    En MongoDB la jerarquía es:

    Servidor → Bases de datos → Colecciones → Documentos → Campos
    

    Ejemplo:

    • Base de datos: tienda
    • Colección: productos
    • Documento:
    {
      "nombre": "Galletas",
      "precio": 1.20,
      "stock": 50
    }
    

    7. Exportación e Importación (extra)

    Exportar una colección:

    mongoexport --db tienda --collection clientes --out clientes.json
    

    Importar:

    mongoimport --db tienda --collection clientes --file clientes.json
    

    8. Detener el servicio y desinstalar (opcional)

    Detener:

    sudo systemctl stop mongod
    

    Desinstalar:

    sudo apt purge mongodb-org -y
    sudo rm -r /var/log/mongodb
    sudo rm -r /var/lib/mongodb
    

    Práctica Guiada: “MongoDB en la USS Horizon”

    La USS Horizon ha sido enviada a explorar un cúmulo estelar cercano a Andoria. La tripulación científica necesita un sistema de gestión para almacenar informes, muestras biológicas, registros de comunicaciones y perfiles de planetas. Como Oficial de Ingeniería Informática, tu misión es instalar un sistema MongoDB en el núcleo de datos del servidor de la nave, aprender a administrarlo por consola y cargar registros básicos.


    FASE 1 — Instalación del Servidor MongoDB

    Instalar MongoDB en el servidor Linux de la USS Horizon.

    Procedimiento

    1. Accede al servidor (terminal local o SSH).
    2. Actualiza los paquetes del sistema:
    sudo apt update && sudo apt upgrade -y
    
    1. Añade la llave GPG del “repositorio de la Federación”:
    curl -fsSL https://pgp.mongodb.com/server-7.0.asc | \
    sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor
    
    1. Activa el repositorio estable:
    echo "deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg] \
    https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | \
    sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
    
    1. Instala MongoDB:
    sudo apt update
    sudo apt install -y mongodb-org
    

    Validación

    Si no ha habido errores, MongoDB está instalado en el servidor auxiliar del núcleo de datos.


    FASE 2 — Arranque del Núcleo de Datos MongoDB

    Objetivo

    Levantar el servicio mongod y verificar su estado.

    Procedimiento

    1. Inicia el servicio:
    sudo systemctl start mongod
    
    1. Comprueba su estado operativo:
    sudo systemctl status mongod
    
    1. Actívalo para que arranque con el sistema de la nave:
    sudo systemctl enable mongod
    

    Validación

    Si el servicio está activo, el núcleo de datos está disponible.


    FASE 3 — Acceso al Observador de Datos (mongosh)

    Objetivo

    Acceder a la consola interactiva de MongoDB.

    Procedimiento

    Entrada al núcleo:

    mongosh
    

    Resultado esperado:

    test>
    

    Ese prompt indica que estás dentro del sistema base.


    FASE 4 — Organización del Archivo Estelar

    En la Flota Estelar, los registros se organizan por sectores. En MongoDB será así:

    Servidor → Bases de datos → Colecciones → Documentos → Campos
    

    FASE 5 — Creación de Base de Datos y Colecciones

    Objetivo

    Crear una base de datos para almacenar datos del Sector Andoria.

    Procedimiento

    1. Cambia a la base de datos andoria_sector:
    use andoria_sector
    

    Ahora crearás una colección llamada planetas.

    1. Inserta un documento básico:
    db.planetas.insertOne({
      nombre: "Andoria",
      especie_principal: "Andoriano",
      clima: "Frío",
      alineacion: "Federación",
      tecnologia: "Warp"
    })
    
    1. Comprueba el contenido:
    db.planetas.find()
    

    FASE 6 — Manejo de Registros Científicos

    Objetivo

    Insertar, buscar, actualizar y eliminar registros.

    A) Inserciones múltiples

    Añade varios planetas explorados:

    db.planetas.insertMany([
      { nombre: "Vulcano", especie_principal: "Vulcano", alineacion: "Federación", tecnologia: "Warp" },
      { nombre: "Qo'noS", especie_principal: "Klingon", alineacion: "Imperio Klingon", tecnologia: "Warp" },
      { nombre: "Romulus", especie_principal: "Romulano", alineacion: "Imperio Estelar", tecnologia: "Warp" }
    ])
    

    B) Consultas

    Lista los planetas:

    db.planetas.find()
    

    Filtra por alineación:

    db.planetas.find({ alineacion: "Federación" })
    

    C) Actualizaciones

    El Consejo Andoriano ha cambiado la clasificación de Andoria:

    db.planetas.updateOne(
      { nombre: "Andoria" },
      { $set: { clima: "Ártico" } }
    )
    

    D) Eliminaciones

    Tras un incidente diplomático, se decide borrar temporalmente un registro:

    db.planetas.deleteOne({ nombre: "Romulus" })
    

    Comprueba que desapareció:

    db.planetas.find()
    

    FASE 7 — Gestión de Colecciones y Base de Datos

    Ver colecciones existentes

    show collections
    

    Eliminar una colección entera

    Ejemplo:

    db.planetas.drop()
    

    Eliminar una base de datos

    Primero asegúrate de estar en ella:

    use andoria_sector
    

    Luego:

    db.dropDatabase()
    

    FASE 8 — Exportación e Importación (Bitácora Estelar)

    Para generar bitácoras externas:

    Exportar colección:

    mongoexport --db andoria_sector --collection planetas --out planetas.json
    

    Importar colección:

    mongoimport --db andoria_sector --collection planetas --file planetas.json
    

    FASE 9 — Cierre del Núcleo

    Puedes detener el servicio si la nave entra en modo de sigilo:

    sudo systemctl stop mongod
    

  • 2. MongoDB Compass

    2. MongoDB Compass

    Compass es un entorno gráfico oficial para MongoDB. Permite:

    • Conectarse a una base de datos local o remota
    • Ver bases de datos y colecciones
    • Visualizar documentos
    • Crear, editar y borrar documentos
    • Crear índices
    • Lanzar agregaciones con interfaz visual
    • Ver estadísticas de la colección (distribuciones, tamaños, etc.)

    En esencia, Compass cumple el mismo papel que “phpMyAdmin” en MySQL, pero para MongoDB.


    Instalación de MongoDB Compass (Linux/Windows/macOS)

    Para clase normalmente recomiendo:

    • Que los alumnos lo instalen en su portátil si lo tienen
    • Si no, instalarlo en el servidor Linux con GUI (si existe) o usar su PC personal

    Descarga oficial

    https://www.mongodb.com/try/download/compass

    Ir a:

    Seleccionar:

    • Versión estable
    • Sistema operativo correspondiente

    Instalar siguiendo el asistente.


    Configuración inicial en clase

    Antes de abrir Compass, asegúrate de que el servidor MongoDB ya está corriendo en Linux:

    sudo systemctl status mongod
    

    Y que el puerto por defecto (27017) está accesible en la red del aula.

    Si usan Compass desde sus ordenadores:

    • Conexión dentro de la misma LAN del aula → bien
    • Si hay cortafuegos, abrir el puerto 27017
    • Si es SSH, configurar túnel (lo explico más abajo opcionalmente)

    Conexión desde Compass (práctica guiada sencilla)

    Abrir Compass → aparecerá pantalla con Connection String.

    Por defecto la cadena es:

    mongodb://localhost:27017
    

    Casos:

    Caso A: Compass instalado en el servidor

    Usar:

    mongodb://localhost:27017
    

    Clic Connect.

    Caso B: Compass desde portátil del alumno

    Si conocen la IP del servidor:

    mongodb://IP_DEL_SERVIDOR:27017
    

    Ejemplo:

    mongodb://192.168.0.50:27017
    

    Para realizar conexiones remotas debemos cambiar la configuración del archivo mongod.conf

    sudo nano /etc/mongod.conf

    y cambiar el 127.0.0.1 por 0.0.0.

    Clic Connect.

    Si la conexión funciona, aparecen las bases de datos.


    Exploración visual de datos (lo que deben observar)

    Una vez dentro:

    1. Sección izquierda: lista de bases de datos
    2. Seleccionar andoria_sector (o la que crearon antes)
    3. Seleccionar colección planetas

    Ahora verán documentos tipo:

    {
      "_id": ObjectId("..."),
      "nombre": "Andoria",
      "especie_principal": "Andoriano",
      ...
    }
    

    Aquí ya puedes hacer mini demostración:

    • Ordenar por campo
    • Editar un documento (botón Edit Document)
    • Añadir nuevos campos manualmente
    • Borrar un documento desde la interfaz

    Esto consolida el concepto “un documento no necesita la misma estructura en todos los registros”.


    Agregaciones visuales (el jugo interesante)

    Compass tiene una sección llamada Aggregations:

    • Clic en Aggregations
    • Crear un pipeline con $match
    • Ejemplo:
    { "$match": { "alineacion": "Federación" } }
    

    Esto muestra solo planetas federados.

    Si quieres mostrarles algo más vistoso:

    • $group por alineacion
    • $sort descendente por conteo

    El pipeline sería:

    [
      { "$group": { "_id": "$alineacion", "total": { "$sum": 1 } } },
      { "$sort": { "total": -1 } }
    ]
    

    Esto es excelente para enseñar que MongoDB es más “analítico” que un simple CRUD.


    Índices

    Compass → pestaña Indexes

    Allí puedes:

    • Ver índices existentes
    • Crear uno nuevo desde GUI

    Por ejemplo, crear índice en nombre:

    • Clic Create Index
    • Campo: nombre
    • Orden: Ascending
    • Crear

    Esto deja caer la idea de rendimiento sin entrar en ingeniería pesada.


    Estadísticas de colección

    Compass tiene una pestaña Schema que permite:

    • Inferir estructura de documentos
    • Detectar tipos
    • Ver distribuciones

    Ejemplo: podrían ver que clima es “Frío”, “Ártico”, etc.
    Visualmente ayuda a entender diversidad de documentos.


    Práctica Guiada: “Exploración Visual de Datos con MongoDB Compass”

    La USS Horizon ha completado su instalación del núcleo MongoDB en la sala de máquinas. Ahora la Sección de Ciencia quiere que los oficiales accedan a los registros desde una interfaz visual que permita agrupar, filtrar y entender datos sin necesidad de abrir un terminal. Te han asignado la operación.


    FASE 1 — Preparar la Conexión desde Compass

    Tu estación de trabajo local será el cliente de monitorización. Antes de iniciar la misión:

    1. Asegúrate de que MongoDB está activo en el servidor de la nave:
    sudo systemctl status mongod
    
    1. Si estás en el mismo equipo donde instalaste MongoDB, podrás conectarte con localhost.
    2. Si estás desde otro equipo del aula, necesitas la IP del servidor de la nave (por ejemplo 192.168.0.50).

    Abre MongoDB Compass y en el campo de conexión escribe:

    Para conexión local:

    mongodb://localhost:27017
    

    Para conexión remota en la red de aula:

    mongodb://IP_DEL_SERVIDOR:27017
    

    Pulsa Connect. Si todo va bien, deberías ver una lista de bases de datos en la barra lateral izquierda. Bienvenido al puente de mando.


    FASE 2 — Exploración de la Biblioteca de Datos

    Al conectarte, Compass mostrará un conjunto de bases predeterminadas del sistema.

    Tu tarea inicial consiste en crear una estructura nueva que represente planetas registrados por la Federación.

    1. Dirígete al botón de Create database
    2. Nombre de la base de datos: fed_records
    3. Nombre de la colección inicial: planets
    4. Clic en Create

    Acabas de crear un archivo científico dentro de la Biblioteca Estelar.


    FASE 3 — Inserción de Datos Científicos

    Ahora toca poblar la colección con datos reales que los sensores ya capturaron.
    Compass permite insertar datos con un editor visual.

    Abre la colección planets y pulsa Insert Document.

    Aparece un editor con un documento JSON. Rellénalo con:

    {
      "name": "Vulcan",
      "species": "Vulcans",
      "affiliation": "Federation",
      "warp_capable": true
    }
    

    Pulsa Insert para guardar.

    Agrega un segundo documento pero esta vez usando Insert Document y cambia el contenido:

    {
      "name": "Qo'noS",
      "species": "Klingons",
      "affiliation": "Klingon Empire",
      "warp_capable": true
    }
    

    Inserta un tercero:

    {
      "name": "Ferenginar",
      "species": "Ferengi",
      "affiliation": "Ferengi Alliance",
      "warp_capable": true
    }
    

    Fíjate en un detalle interesante: no hay esquema rígido. MongoDB no te obliga a declarar columnas antes. Es como una biblioteca que acepta libros sin exigir número exacto de capítulos.


    FASE 4 — Visualización y Edición de Documentos

    Observa cómo Compass representa cada documento con su _id. Esa key es asignada automáticamente y sirve como identificador universal.

    Ahora haz dos pruebas:

    1. Edita un documento desde el icono Edit Document
      Cambia warp_capable de true a false en algún planeta no confirmado. Guarda y comprueba que Compass valida el JSON.
    2. Elimina un planeta usando el botón Delete para simular que los registros debieron ser clasificadas tras un fallo diplomático.

    Nadie en la Flota se escapa del poder del botón Delete.


    FASE 5 — Consultas Visuales con Filtros

    La Sección de Ciencia quiere consultar todos los planetas bajo Federation.
    Compass lo hace sin comandos: usa el buscador superior.

    Pulsa el filtro visual y escribe:

    { "affiliation": "Federation" }
    

    Pulsa Apply.

    Si el universo está en orden, solo aparecerán planetas pertenecientes a la Federación.


    FASE 6 — Agregaciones en la Sala de Análisis

    Compass dispone de un módulo llamado Aggregations que permite crear pipelines de análisis (equivalente a map–reduce ligero).

    Entra en Aggregations y añade una etapa $group:

    {
      "$group": {
        "_id": "$affiliation",
        "total": { "$sum": 1 }
      }
    }
    

    Pulsa Run.

    Compass mostrará un resultado parecido a una estadística diplomática:

    Federation: 1
    Klingon Empire: 1
    Ferengi Alliance: 1
    

    Este tipo de vista enseña que MongoDB no solo guarda datos, también los procesa de forma analítica.


    FASE 7 — Inferir Esquemas

    Entra en la pestaña Schema dentro de la colección.

    Compass examinará los documentos e inferirá:

    • Tipos de campos
    • Frecuencia de aparición
    • Valores más comunes

    Esto simula cómo la Sección de Xenobiología analiza patrones entre especies sin necesidad de preguntar “¿cuál es la estructura del registro?”.


    FASE 8 — Crear Índices

    Ahora ve a la pestaña Indexes para crear un índice sobre el campo name.

    Pulsa Create Index y configura:

    • Field: name
    • Sort: Ascending

    Clic en Create.

    MongoDB construirá el índice internamente. Tu planeta ahora se encuentra más rápido cuando alguien lo necesita. Rendimiento y diplomacia se dan la mano.


    FASE 9 — Desconexión y Cierre de Misión

    Cierra Compass.
    Detén el servicio MongoDB solo si el servidor necesita entrar en modo sigilo:

    sudo systemctl stop mongod
    

    La misión Compass se considera cumplida si has conseguido:

    • Conectarse a una instancia MongoDB
    • Crear bases de datos y colecciones desde GUI
    • Insertar y editar documentos
    • Filtrar visualmente

  • 3. MongoDB desde PHP y Python

    3. MongoDB desde PHP y Python

    Partimos de:

    • Servidor MongoDB: ya instalado y corriendo en Linux (mongod).
    • Base de datos de ejemplo: fed_records
    • Colección de ejemplo: planets
    • Conexión por defecto: mongodb://localhost:27017
      (si el servidor está en otra máquina: mongodb://IP_DEL_SERVIDOR:27017)

    En ambos lenguajes usaremos:

    • Crear conexión
    • Elegir base de datos y colección
    • CRUD básico: insertar, listar, buscar, actualizar, borrar

    Uso de MongoDB desde PHP

    Instalar el driver de MongoDB para PHP

    En un entorno típico (Linux con PHP y Apache):

    1. Instalar la extensión de MongoDB:
    sudo pecl install mongodb
    

    Puede ser que no tengas instaladas las herramientas deb, para hacerlo en ubuntu:

    sudo apt update
    sudo apt install php-pear php-dev build-essential

    Tambien debemos instalar el conector de mongo con PHP

    sudo apt install php-mongodb

    1. Activar la extensión en PHP (por ejemplo en /etc/php/8.3/apache2/php.ini o similar):

    Añadir esta línea:

    extension=mongodb.so
    
    1. Reiniciar Apache:
    sudo systemctl restart apache2
    
    1. Instalar el paquete Composer del driver oficial:

    En el directorio del proyecto PHP:

    composer require mongodb/mongodb
    

    Si no usan Composer todavía, esta es buena ocasión para introducirlo.

    Si no tienes instalada la herramienta composer de php:

    sudo apt install composer

    Recuerda que siempre es util pedir al servidor que muestre los errores de código.

    ini_set(‘display_errors’, 1);

    ini_set(‘display_startup_errors’, 1);

    error_reporting(E_ALL);

    Estructura de conexión en PHP

    Archivo de ejemplo: mongo_test.php

    <?php
    require 'vendor/autoload.php'; // Carga automática de Composer
    
    use MongoDB\Client;
    
    // 1. Crear cliente (conexión)
    $client = new Client("mongodb://localhost:27017");
    
    // 2. Seleccionar base de datos y colección
    $database = $client->fed_records;
    $collection = $database->planets;
    
    // 3. Insertar un documento
    $insertResult = $collection->insertOne([
        'name' => 'Vulcan',
        'species' => 'Vulcans',
        'affiliation' => 'Federation',
        'warp_capable' => true
    ]);
    
    echo "Insertado con ID: " . $insertResult->getInsertedId() . "<br>";
    
    // 4. Buscar todos los documentos
    echo "<h2>Lista de planetas:</h2>";
    
    $cursor = $collection->find();
    
    foreach ($cursor as $planet) {
        echo "Nombre: " . $planet['name'] . " - Alineación: " . $planet['affiliation'] . "<br>";
    }
    
    // 5. Búsqueda filtrada
    echo "<h2>Planetas de la Federación:</h2>";
    
    $cursor = $collection->find(['affiliation' => 'Federation']);
    
    foreach ($cursor as $planet) {
        echo "Nombre: " . $planet['name'] . "<br>";
    }
    

    Abrir en el navegador (por ejemplo):
    http://localhost/mongo_test.php


    Operaciones CRUD básicas en PHP

    Insertar varios documentos

    $collection->insertMany([
        [
            'name' => 'Qo\'noS',
            'species' => 'Klingons',
            'affiliation' => 'Klingon Empire',
            'warp_capable' => true
        ],
        [
            'name' => 'Ferenginar',
            'species' => 'Ferengi',
            'affiliation' => 'Ferengi Alliance',
            'warp_capable' => true
        ]
    ]);
    

    Buscar un solo documento

    $planet = $collection->findOne(['name' => 'Vulcan']);
    
    if ($planet) {
        echo "Encontrado: " . $planet['name'] . " (" . $planet['species'] . ")";
    }
    

    Actualizar

    $updateResult = $collection->updateOne(
        ['name' => 'Vulcan'],
        ['$set' => ['warp_capable' => false]]
    );
    
    echo "Documentos modificados: " . $updateResult->getModifiedCount();
    

    Borrar

    $deleteResult = $collection->deleteOne(['name' => 'Ferenginar']);
    
    echo "Documentos eliminados: " . $deleteResult->getDeletedCount();
    

    Con esto ya pueden hacer una pequeña “mini-API” o scripts de administración en PHP.


    Uso de MongoDB desde Python

    Instalar el driver de MongoDB para Python

    Usaremos el driver oficial pymongo.

    Pymongo vive fuera del zoológico de paquetes de Ubuntu, así que el mensaje de PEP 668 que viste antes aplica aquí. La forma elegante es montar un entorno virtual y meter ahí el driver.

    Pasos rápidos:

    Instala las herramientas para crear entornos:

    sudo apt install python3-venv python3-full
    

    Crea un entorno para tu proyecto Mongo:

    python3 -m venv ~/.venvs/mongo
    

    Actívalo:

    source ~/.venvs/mongo/bin/activate
    

    Ahora el pip dentro de ese entorno puede instalar lo que sea sin que Ubuntu proteste:

    pip install pymongo
    

    Comprueba que funciona desde Python:

    python3 - << 'EOF'
    import pymongo
    print("Pymongo ok, versión:", pymongo.__version__)
    EOF


    Conexión y CRUD básico en Python

    Archivo de ejemplo: mongo_test.py

    from pymongo import MongoClient
    
    # 1. Crear cliente (conexión)
    client = MongoClient("mongodb://localhost:27017")
    
    # 2. Seleccionar base de datos y colección
    db = client["fed_records"]
    planets = db["planets"]
    
    # 3. Insertar un documento
    result = planets.insert_one({
        "name": "Vulcan",
        "species": "Vulcans",
        "affiliation": "Federation",
        "warp_capable": True
    })
    
    print("Insertado con ID:", result.inserted_id)
    
    # 4. Obtener todos los documentos
    print("\nLista de planetas:")
    for planet in planets.find():
        print(f"- {planet['name']} ({planet['affiliation']})")
    
    # 5. Búsqueda filtrada
    print("\nPlanetas de la Federación:")
    for planet in planets.find({"affiliation": "Federation"}):
        print(f"- {planet['name']}")
    

    Ejecutar:

    python3 mongo_test.py
    

    Operaciones CRUD más completas en Python

    planets.insert_many([
        {
            "name": "Qo'noS",
            "species": "Klingons",
            "affiliation": "Klingon Empire",
            "warp_capable": True
        },
        {
            "name": "Ferenginar",
            "species": "Ferengi",
            "affiliation": "Ferengi Alliance",
            "warp_capable": True
        }
    ])
    

    Buscar uno

    Insertar varios

    vulcan = planets.find_one({"name": "Vulcan"})
    if vulcan:
        print("Encontrado:", vulcan["name"], "-", vulcan["species"])
    

    Actualizar

    update_result = planets.update_one(
        {"name": "Vulcan"},
        {"$set": {"warp_capable": False}}
    )
    
    print("Documentos modificados:", update_result.modified_count)
    

    Borrar

    delete_result = planets.delete_one({"name": "Ferenginar"})
    print("Documentos eliminados:", delete_result.deleted_count)
    

    Ejemplo de pequeña “consulta analítica” (aggregations) en Python

    Simulando algo tipo “cuántos planetas hay por alineación”:

    pipeline = [
        {"$group": {"_id": "$affiliation", "total": {"$sum": 1}}},
        {"$sort": {"total": -1}}
    ]
    
    print("\nResumen por alineación:")
    for group in planets.aggregate(pipeline):
        print(f"{group['_id']}: {group['total']}")
    

    Este ejemplo encaja muy bien con lo que ya han visto en Compass (pestaña Aggregations).


    Práctica Guiada:

    “Un mismo universo de datos: PHP, Python y MongoDB Compass”

    Antes de empezar, debe estar listo:

    1. Servidor MongoDB instalado y funcionando en el servidor Linux: sudo systemctl status mongod
    2. PHP instalado (por ejemplo PHP 8.x) y un servidor web (Apache) o PHP CLI.
    3. Composer instalado: composer --version
    4. Python 3 instalado: python3 --version
    5. MongoDB Compass instalado en el equipo del alumno o en alguna máquina con entorno gráfico.

    PARTE 1 – PHP + MongoDB

    Fase 1.1 — Preparar el proyecto PHP

    1. Crea una carpeta para el proyecto, por ejemplo: mkdir ~/mongo_php_lab cd ~/mongo_php_lab
    2. Instala el driver oficial de MongoDB para PHP vía Composer: composer require mongodb/mongodb
    3. Asegúrate de tener instalada y activada la extensión nativa de MongoDB en PHP:
      • Instalar extensión (si no está): sudo pecl install mongodb
      • Añadir en el php.ini correspondiente (CLI o Apache): extension=mongodb.so
      • Reiniciar Apache si usas servidor web: sudo systemctl restart apache2
      • Comprobar desde CLI: php -m | grep mongodb
      Debe aparecer mongodb en la lista de módulos.

    Fase 1.2 — Crear el script PHP

    Crea el archivo mongo_php_lab.php dentro de ~/mongo_php_lab con este contenido:

    <?php
    require 'vendor/autoload.php';
    
    use MongoDB\Client;
    
    // 1. Conexión al servidor MongoDB
    $client = new Client("mongodb://localhost:27017");
    
    // 2. Selección de base de datos y colección
    $database = $client->fed_records;
    $collection = $database->planets;
    
    echo "<h1>PHP + MongoDB: Laboratorio de planetas</h1>";
    
    // 3. Insertar varios planetas (insertMany)
    echo "<h2>1. Insertando planetas...</h2>";
    
    $insertResult = $collection->insertMany([
        [
            'name' => 'Vulcan',
            'species' => 'Vulcans',
            'affiliation' => 'Federation',
            'warp_capable' => true
        ],
        [
            'name' => "Qo'noS",
            'species' => 'Klingons',
            'affiliation' => 'Klingon Empire',
            'warp_capable' => true
        ],
        [
            'name' => 'Ferenginar',
            'species' => 'Ferengi',
            'affiliation' => 'Ferengi Alliance',
            'warp_capable' => true
        ]
    ]);
    
    echo "Planetas insertados: " . $insertResult->getInsertedCount() . "<br>";
    
    // 4. Listar todos los planetas
    echo "<h2>2. Lista completa de planetas</h2>";
    
    $cursor = $collection->find();
    
    foreach ($cursor as $planet) {
        echo "Nombre: " . $planet['name'] .
             " | Especie: " . $planet['species'] .
             " | Alineación: " . $planet['affiliation'] .
             " | Warp: " . ($planet['warp_capable'] ? 'Sí' : 'No') .
             "<br>";
    }
    
    // 5. Mostrar solo los de la Federación
    echo "<h2>3. Planetas de la Federación</h2>";
    
    $cursorFed = $collection->find(['affiliation' => 'Federation']);
    
    foreach ($cursorFed as $planet) {
        echo "Nombre: " . $planet['name'] . "<br>";
    }
    
    // 6. Cambiar un campo (warp_capable) para Vulcan
    echo "<h2>4. Actualizando warp_capable de Vulcan a false</h2>";
    
    $updateResult = $collection->updateOne(
        ['name' => 'Vulcan'],
        ['$set' => ['warp_capable' => false]]
    );
    
    echo "Documentos modificados: " . $updateResult->getModifiedCount() . "<br>";
    
    // 7. Borrar un registro (Ferenginar)
    echo "<h2>5. Borrando el planeta Ferenginar</h2>";
    
    $deleteResult = $collection->deleteOne(['name' => 'Ferenginar']);
    
    echo "Documentos eliminados: " . $deleteResult->getDeletedCount() . "<br>";
    
    // 8. Lista final para comprobar cambios
    echo "<h2>6. Lista final de planetas tras cambios</h2>";
    
    $cursorFinal = $collection->find();
    
    foreach ($cursorFinal as $planet) {
        echo "Nombre: " . $planet['name'] .
             " | Alineación: " . $planet['affiliation'] .
             " | Warp: " . ($planet['warp_capable'] ? 'Sí' : 'No') .
             "<br>";
    }
    

    Fase 1.3 — Ejecutar el script PHP

    Opción A – Desde navegador (si usas Apache):

    1. Copia el proyecto a la carpeta del servidor, por ejemplo: sudo cp -r ~/mongo_php_lab /var/www/html/
    2. En el navegador, abre: http://IP_DEL_SERVIDOR/mongo_php_lab/mongo_php_lab.php

    Opción B – Desde línea de comandos (CLI):

    cd ~/mongo_php_lab
    php mongo_php_lab.php
    

    (La salida será texto plano, pero funcional para comprobar inserciones y cambios.)

    Cuando termine esta parte, en la colección fed_records.planets deberían existir al menos:

    • Vulcan (warp_capable = false tras el update)
    • Qo'noS
      Y no debería estar Ferenginar (borrado).

    PARTE 2 – Python + MongoDB

    Ahora toca hacer lo mismo, pero desde Python, y además añadir una agregación por affiliation.

    Fase 2.1 — Instalar pymongo

    En el servidor o equipo donde ejecutes Python:

    pip install pymongo
    

    (si usas pip3, cámbialo por pip3)


    Fase 2.2 — Crear el script Python

    En tu home (o donde quieras), crea para el lab:

    mkdir ~/mongo_python_lab
    cd ~/mongo_python_lab
    

    Crea el archivo mongo_python_lab.py con este contenido:

    from pymongo import MongoClient
    
    # 1. Conexión al servidor MongoDB
    client = MongoClient("mongodb://localhost:27017")
    
    # 2. Seleccionar base de datos y colección
    db = client["fed_records"]
    planets = db["planets"]
    
    print("PYTHON + MongoDB: Laboratorio de planetas\n")
    
    # 3. Insertar nuevos planetas
    print("1) Insertando nuevos planetas...\n")
    
    insert_result = planets.insert_many([
        {
            "name": "Andoria",
            "species": "Andorians",
            "affiliation": "Federation",
            "warp_capable": True
        },
        {
            "name": "Cardassia Prime",
            "species": "Cardassians",
            "affiliation": "Cardassian Union",
            "warp_capable": True
        }
    ])
    
    print("IDs insertados:", insert_result.inserted_ids, "\n")
    
    # 4. Listar todos los planetas
    print("2) Lista completa de planetas:")
    
    for planet in planets.find():
        print(f"- {planet['name']} ({planet['affiliation']}) | Warp: {planet.get('warp_capable', 'N/A')}")
    
    print()
    
    # 5. Filtrar solo la Federación
    print("3) Planetas de la Federación:")
    
    for planet in planets.find({"affiliation": "Federation"}):
        print(f"- {planet['name']}")
    
    print()
    
    # 6. Actualizar: poner warp_capable = True de nuevo en Vulcan (si existe)
    print("4) Actualizando warp_capable de Vulcan a True...\n")
    
    update_result = planets.update_one(
        {"name": "Vulcan"},
        {"$set": {"warp_capable": True}}
    )
    
    print("Documentos modificados:", update_result.modified_count, "\n")
    
    # 7. Borrar un planeta concreto: Cardassia Prime
    print("5) Borrando Cardassia Prime...\n")
    
    delete_result = planets.delete_one({"name": "Cardassia Prime"})
    print("Documentos eliminados:", delete_result.deleted_count, "\n")
    
    # 8. Agregación por affiliation
    print("6) Agregación: número de planetas por affiliation:\n")
    
    pipeline = [
        {"$group": {"_id": "$affiliation", "total": {"$sum": 1}}},
        {"$sort": {"total": -1}}
    ]
    
    for group in planets.aggregate(pipeline):
        print(f"{group['_id']}: {group['total']} planetas")
    

    Fase 2.3 — Ejecutar el script Python

    Desde la carpeta del proyecto:

    cd ~/mongo_python_lab
    python3 mongo_python_lab.py
    

    Observa:

    • Insertará Andoria y Cardassia Prime.
    • Luego listará todo lo que haya en fed_records.planets (incluyendo lo creado por PHP).
    • Volverá a poner Vulcan con warp_capable = True.
    • Borrará Cardassia Prime.
    • Mostrará la agregación por affiliation.

    Con esto ya habrán hecho la misma lógica (y algo más) que en PHP, pero desde Python.


    PARTE 3 – Verificación en MongoDB Compass

    (La parte chula para cerrar el círculo)

    Fase 3.1 — Conectarse con Compass

    1. Abre MongoDB Compass.
    2. En la pantalla inicial de conexión, usa:
      • Si Compass está en el mismo servidor que MongoDB:
        • mongodb://localhost:27017
      • Si Compass está en otro equipo de la red:
        • mongodb://IP_DEL_SERVIDOR:27017
    3. Pulsa Connect.

    Fase 3.2 — Explorar la base de datos fed_records

    1. En la barra lateral izquierda, localiza la base de datos fed_records.
    2. Entra en la colección planets.

    Ahí deberías ver documentos provenientes de:

    • Las inserciones del script PHP.
    • Las inserciones del script Python.

    Es decir, una mezcla de Vulcan, Qo’noS, Andoria, etc.


    Fase 3.3 — Comprobar coherencia de los cambios

    1. Verifica que:
      • Vulcan existe y tiene warp_capable = true (último cambio lo hizo Python).
      • Ferenginar no está (PHP lo borró).
      • Cardassia Prime no está (Python lo borró).
    2. Modifica un documento desde Compass, por ejemplo:
      • Edita Qo'noS y cambia affiliation a "Klingon Empire (Updated)".
      • Guarda los cambios.
    3. Vuelve a ejecutar el script Python: cd ~/mongo_python_lab python3 mongo_python_lab.py En la parte de “lista completa de planetas” verás la nueva affiliation de Qo'noS leída desde Python.
    4. Si vuelves a ejecutar el script PHP, también verá la misma realidad.

    Con esto se ve claramente que la fuente de verdad es MongoDB, y PHP / Python / Compass son solo distintas formas de mirar y manipular ese mismo universo de datos.