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.