Python - 如何选择ObjectId

时间:2012-11-09 23:39:28

标签: python pymongo

Python noob在这里。我在我的数据库中有一个名为“data”的对象,我想编写一些python,它将从每组student_id中选择最低分数....并为每个找到的最小记录获取唯一的ObjectId?

{u'student_id': 197, u'_id': ObjectId('50906d7fa3c412bb040eb88d'), u'type': u'homework', u'score': 10.90872422518918}
{u'student_id': 197, u'_id': ObjectId('50906d7fa3c412bb040eb88e'), u'type': u'homework', u'score': 88.3871242475841}
{u'student_id': 198, u'_id': ObjectId('50906d7fa3c412bb040eb892'), u'type': u'homework', u'score': 17.46279901047208}
{u'student_id': 198, u'_id': ObjectId('50906d7fa3c412bb040eb891'), u'type': u'homework', u'score': 76.18366499496366}
{u'student_id': 199, u'_id': ObjectId('50906d7fa3c412bb040eb895'), u'type': u'homework', u'score': 49.34223066136407}
{u'student_id': 199, u'_id': ObjectId('50906d7fa3c412bb040eb896'), u'type': u'homework', u'score': 58.09608083191365}

感谢您的麻烦......这是我的代码......

import pymongo

from itertools import groupby
from pymongo import Connection


connection = Connection('localhost', 27017)

db = connection.students

data = db.grades.find({'type' : 'homework'}).sort([('student_id',pymongo.ASCENDING),('score',pymongo.ASCENDING)])



for student_id, items in groupby(data, lambda s: s['student_id']):
    lowest_score = min(i['score'] for i in items)

    print lowest_score

2 个答案:

答案 0 :(得分:2)

我认为您可能能够以不同方式进行最小化检查并获得ObjectID而不是最小值的分数。以下是我的表现:

lowest_id = min(items, key=lambda i: i['score'])['_id']

现在,您可以(实际上,可能)在数据库本身可以做类似的事情,并且可能会有更好的性能。但是,如果您的数据集不是太笨重,上面的工作可能会很好。

答案 1 :(得分:1)

不确定您是否仍然可以访问student_id字段,如果可以,则可以替换:

lowest_score = min(i['score'] for i in items)

使用:

lowest_score = min((i['score'],i['student_id']) for i in items)