现对某网站用户的比赛数据排名使用 MongoDB 处理,现在有一系列的用户数据,通过python脚本,输入任意用户的 ID,返回排名。如果用户没有比赛记录,则排名返回 0。
排名规则首先按分数排名,如果分数相同则花费的总时间越少则排名越高。
对于多条件排序,使用MongoDB的aggregate方法是最快的。
或者也可以使用python的sorted方法,但是这个方法可能会更耗内存。
#!/usr/bin/python
import sys
from pymongo import MongoClient
def get_rank(user_id):
client = MongoClient()
db = client.ranksdata #连接database
contests = db.contests #获取collection
ranklist = []
# 使用MongoDB聚合函数进行排序,先对比赛成绩进行降序排序,后对提交时间进行升序排序
ranks = contests.aggregate([
{"$sort" : {"score":-1,"submit_time":1}}
])
# userlist = sorted(ranks,key=lambda x:(-x['score'],x['submit_time'])) 也可以使用python的sorted方法进行排序
for x in ranks:
ranklist.append(x['user_id'])
if x['user_id'] == int(user_id):
rank = ranklist.index(int(user_id)) + 1
break
return rank
if len(sys.argv) != 2:
print "Parameter error."
sys.exit(1)
user_id = sys.argv[1]
rank = get_rank(user_id)
print user_id, rank