У меня есть коллекция student
, содержащая не менее 15 миллионов документов. Пример структуры документа выглядит следующим образом:
{
"_id": "ObjectId('5e8baxxxxxe400a')",
"Email":"xxx1@gmail.com",
"Favourites": ["Red","Blue","Green","Orange","Black"]
"marks": [{"physics":23,"maths":20,"chemistry":19}]
},
{
"_id": "ObjectId('5e8baxxxxxe4002')",
"Email":"xxx2@gmail.com",
"Favourites": ["Purple","Pink","Magenta","White","Black"]
"marks": [{"physics":22,"maths":25,"chemistry":19}]
},
{
"_id": "ObjectId('5e8baxxxxxe4002')",
"Email":"xxx3@gmail.com",
"Favourites": ["Red","Yellow","Grey","White","Black"]
"marks": [{"physics":12,"maths":14,"chemistry":19}]
},
{
"_id": "ObjectId('5e8baxxxxxe4002')",
"Email":"xxx4@gmail.com",
"Favourites": ["Green", "White","Pink"]
"marks": [{"physics":25,"maths":25,"chemistry":19}]
},
{
"_id": "ObjectId('5e8baxxxxxe4002')",
"Email":"xxx5@gmail.com",
"Favourites": ["Green", "White","Black"]
"marks": [{"physics":10,"maths":9,"chemistry":19}]
},
.....
....
Я ищу способ написать Генератор для расчета общего количества баллов для каждого студенческого документа.
Мой код выглядит следующим образом.
def query():
r = db.student.aggregate([
{
"$project": {
"Email":1,
"marks":1,
}
}
])
for i in r:
yield i
def find_total_score(doc):
total = <code to calculate total by adding marks of physics chemistry and maths>
doc['total'] = total #write back the total score for sorting
it = iter(query())
while True:
try:
item = next(it)
find_total_score(item)
except StopIteration:
break
Здесь, чтобы завершить весь процесс, требуется несколько минут. Я не получаю никаких преимуществ от использования Generator fuction. Что я здесь не так делаю?