-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path4_migrar_mongodb.py
More file actions
112 lines (92 loc) · 4.52 KB
/
Copy path4_migrar_mongodb.py
File metadata and controls
112 lines (92 loc) · 4.52 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import subprocess
import json
import os
os.chdir(os.path.dirname(os.path.abspath(__file__)))
CONTAINER = "escuela_mongo"
DB = "escuela_db"
def mongo_eval(js):
"""Ejecuta JavaScript dentro del contenedor MongoDB."""
result = subprocess.run(
["docker", "exec", "-i", CONTAINER, "mongosh", "--quiet", DB, "--eval", js],
capture_output=True, text=True, encoding="utf-8"
)
return result.stdout.strip(), result.stderr.strip()
# ─── Paso 1: Verificar conexion ───────────────────────────────────────────────
print("[1/4] Verificando conexion con MongoDB en Docker...")
out, err = mongo_eval("db.runCommand({ping:1})")
if "ok" not in out and "ok" not in err:
print(f" ERROR: {err or out}")
print(" Verifica que Docker esta corriendo: docker compose up -d")
exit(1)
print(" OK - MongoDB responde correctamente")
# ─── Paso 2: Cargar datos ─────────────────────────────────────────────────────
print("[2/4] Cargando datos_limpios.json...")
try:
with open("datos_limpios.json", "r", encoding="utf-8") as f:
datos = json.load(f)
except FileNotFoundError:
print(" ERROR: No se encuentra datos_limpios.json")
print(" Ejecuta primero: python 1_limpiar_datos.py")
exit(1)
# Construir diccionarios auxiliares
niveles_dict = {n["id_nivel"]: n["nombre_nivel"] for n in datos["niveles"]}
materias_dict = {m["id_materia"]: m["nombre_materia"] for m in datos["materias"]}
asig_por_docente = {}
for a in datos["asignaciones"]:
asig_por_docente.setdefault(a["id_docente"], []).append({
"id_materia": a["id_materia"],
"nombre_materia": materias_dict.get(a["id_materia"], ""),
"nivel": niveles_dict.get(int(a["id_nivel"]), "")
})
niveles_por_materia = {}
for mn in datos["materia_nivel"]:
niveles_por_materia.setdefault(mn["id_materia"], []).append(
niveles_dict.get(int(mn["id_nivel"]), "")
)
print(" OK - Datos cargados")
# ─── Paso 3: Insertar colecciones ─────────────────────────────────────────────
print("[3/4] Insertando colecciones en MongoDB...")
# Coleccion estudiantes
docs_est = []
for e in datos["estudiantes"]:
doc = dict(e)
doc["_id"] = doc.pop("id_estudiante")
doc["nivel"] = {"id_nivel": doc["id_nivel"], "nombre_nivel": niveles_dict.get(doc["id_nivel"], "")}
del doc["id_nivel"]
docs_est.append(doc)
docs_est_json = json.dumps(docs_est, ensure_ascii=False)
js = f"db.estudiantes.drop(); db.estudiantes.insertMany({docs_est_json}); print('estudiantes: ' + db.estudiantes.countDocuments({{}}) + ' documentos');"
out, err = mongo_eval(js)
print(f" {out}")
# Coleccion docentes
docs_doc = []
for d in datos["docentes"]:
doc = dict(d)
doc["_id"] = doc.pop("id_docente")
doc["asignaciones"] = asig_por_docente.get(doc["_id"], [])
docs_doc.append(doc)
docs_doc_json = json.dumps(docs_doc, ensure_ascii=False)
js = f"db.docentes.drop(); db.docentes.insertMany({docs_doc_json}); print('docentes: ' + db.docentes.countDocuments({{}}) + ' documentos');"
out, err = mongo_eval(js)
print(f" {out}")
# Coleccion materias
docs_mat = []
for m in datos["materias"]:
docs_mat.append({
"_id": m["id_materia"],
"nombre_materia": m["nombre_materia"],
"niveles": niveles_por_materia.get(m["id_materia"], [])
})
docs_mat_json = json.dumps(docs_mat, ensure_ascii=False)
js = f"db.materias.drop(); db.materias.insertMany({docs_mat_json}); print('materias: ' + db.materias.countDocuments({{}}) + ' documentos');"
out, err = mongo_eval(js)
print(f" {out}")
# ─── Paso 4: Verificar datos ──────────────────────────────────────────────────
print("[4/4] Verificando datos en MongoDB...")
out, _ = mongo_eval("JSON.stringify(db.estudiantes.findOne({'nivel.nombre_nivel': 'Sexto'}))")
print(f"\n Estudiante en nivel Sexto:\n {out[:200]}")
out, _ = mongo_eval("JSON.stringify(db.docentes.findOne({'asignaciones.0': {$exists: true}}))")
print(f"\n Docente con asignaciones:\n {out[:200]}")
out, _ = mongo_eval("JSON.stringify(db.materias.findOne({_id: 'MAT101'}))")
print(f"\n Materia MAT101:\n {out[:200]}")
print("\n[OK] Migracion a MongoDB completada exitosamente!")