#!/usr/bin/env python3 """ Acceso a MongoDB desde Python (CREATE + READ) Equivalente al ejemplo Java: acceso-a-MongoDB-via-java.jar Requisito: pip install pymongo """ from pymongo import MongoClient # Cadena de conexión a MongoDB Atlas (misma que en el ejemplo Java) CADENA_CONEXION = "mongodb+srv://MACARENA:XnUKVeI5VcNE4LK1@clusterdam2025.9q7lm.mongodb.net/?retryWrites=true&w=majority&appName=ClusterDAM2025" DB_NAME = "dam" def conectar(): cliente = MongoClient(CADENA_CONEXION) # Ping para confirmar conexión (como en el Java) cliente.admin.command("ping") print("¡Ping exitoso! Conectado correctamente a MongoDB.") return cliente def listar_bases_de_datos(cliente): print("\nBases de datos disponibles:") for nombre in cliente.list_database_names(): print(f" - {nombre}") def crear_colecciones(db): # Limpiar datos anteriores para partir de cero db.profesores.drop() db.alumnos.drop() # CREATE - Profesores (mismos datos que en el ejemplo SQLite) profesores = [ {"_id": 1, "nombre": "Pedro García", "asignatura": "Matemáticas"}, {"_id": 2, "nombre": "Laura Martínez", "asignatura": "Física"}, {"_id": 3, "nombre": "José Rodríguez", "asignatura": "Química"}, ] db.profesores.insert_many(profesores) # CREATE - Alumnos alumnos = [ {"nombre": "Carlos Pérez", "edad": 20, "id_profesor": 1}, {"nombre": "Ana López", "edad": 22, "id_profesor": 2}, {"nombre": "Luis Fernández", "edad": 21, "id_profesor": 3}, ] db.alumnos.insert_many(alumnos) print(f"\nDatos insertados en '{db.name}'.") def listar_colecciones(db): print(f"\nColecciones en '{db.name}':") for nombre in db.list_collection_names(): print(f" - {nombre}") def consultar(db): # READ - Mostrar documentos (estilo Java: recorrer claves) for coleccion_nombre in ["profesores", "alumnos"]: coleccion = db[coleccion_nombre] print(f"\nDocumentos en '{coleccion_nombre}':") for doc in coleccion.find(): for clave, valor in doc.items(): print(f" {clave}: {valor}") print(" ---") # READ - Consulta con lookup (equivalente al JOIN de SQLite) pipeline = [ {"$lookup": { "from": "profesores", "localField": "id_profesor", "foreignField": "_id", "as": "profesor" }}, {"$unwind": "$profesor"} ] print("\nAlumnos y sus profesores:") for doc in db.alumnos.aggregate(pipeline): print(f" Alumno: {doc['nombre']} | Profesor: {doc['profesor']['nombre']}") def main(): print("Hello and welcome!\n") cliente = conectar() try: listar_bases_de_datos(cliente) db = cliente[DB_NAME] crear_colecciones(db) # CREATE listar_colecciones(db) # READ estructura consultar(db) # READ datos finally: cliente.close() print("\nConexión cerrada.") if __name__ == "__main__": main()