programar-un-simple-y-minim.../crud_mongodb.py

104 lines
3.0 KiB
Python

#!/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()