-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathaggregation.py
98 lines (86 loc) · 2.34 KB
/
aggregation.py
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
# Obtener y restaurar en MongoDB el archivo students.json (adjunto) y
# realizar los pipelines necesarios para obtener la siguiente información:
#Calificación promedio de cada alumno.
#Calificación promedio para cada alumno, sólo de exámenes y tareas.
#Calificación promedio de todo el grupo sólo de exámenes
from pymongo import MongoClient
import pprint #pretty print
import json
client = MongoClient("mongodb://localhost:27017/")
db = client["mci"]
Collection = db["students"]
# Descomentar las siguientes lineas antes de ejecutar el programa
# y volver a comentarlas para evitar id duplicados
#students=[]
#for line in open('students.json','r'):
# students.append(json.loads(line))
#Collection.insert_many(students)
while(True):
print(""" Qué desea conocer?
1)Calificación promedio de cada alumno (examen, quiz y tareas).
2)Calificación promedio para cada alumno, sólo de exámenes y tareas.
3)Calificación promedio de todo el grupo sólo de exámenes
4)Salir""")
a=input("\nIngrese su opción: ")
if a == "1":
pipeline = [
{"$unwind": "$scores"},
{"$group":
{
"_id": "$_id",
"avgscore": { "$avg": "$scores.score" }
}
},
{
"$sort":{"_id": 1}
}
]
pprint.pprint(list(db.students.aggregate(pipeline)))
print("\n")
elif a == "2":
pipeline = [
{"$unwind": "$scores"},
{
"$group": {"_id": "$_id",
"avgscore": {
"$avg": {
"$cond": [
{"$or": [{"$eq": ["$scores.type", "exam"]}, {"$eq": [ "$scores.type","homework"]}]},
{"$multiply": ["$scores.score",{"$divide": [3,2 ]}] # se multiplica por 3/2 ya que se toman
#las 3 calificacioes
}, 0 #si no se cumple avgscore toma el valor de 0
]
}
}
}
},
{"$sort":{"_id": 1}}
]
pprint.pprint(list(db.students.aggregate(pipeline)))
print("\n")
elif a == "3":
pipeline = [
{"$unwind": "$scores"},
{"$group": {"_id": "null",
"avgscore": {
"$avg": {
"$cond": [
{"$eq": [ "$scores.type","exam"]},
{"$multiply": [
"$scores.score",{"$divide":[600,200]}
]
},0 #si no se cumple avgscore toma el valor de 0
]
}
}
}
}
]
pprint.pprint(list(db.students.aggregate(pipeline)))
print("\n")
else:
break
else:
print("Opción incorrecta!\n")
else:
break