2017-01-07 2 views
2

Я использую pymongo и пытаюсь создать простой список средних значений, где моя коллекция просто загружает имена и время. (это простая математическая игра, в которой ваша скорость для правильного ответа на вопросы сохраняется).Pymongo: Ограничение результатов, используемых для вычисления среднего значения в конвейере

Каждый результат добавляется к БД через питон-кануна REST API:

{ 
    "_id" : ObjectId("5866ed13fdc3f36f0620dfdb"), 
    "_updated" : ISODate("2016-12-30T23:26:11Z"), 
    "score" : 1, 
    "name" : "adrian", 
    "time" : 2.7628954648971558, 
    "level" : "1", 
    "_etag" : "08dcbbf3718f837194ba6b439cfb6b3de1d5994f", 
    "_created" : ISODate("2016-12-30T23:26:11Z") 
} 

Так я и созданы и обновляются раз.

Я хочу показать среднее время, затрачиваемое для каждого игрока за последние 10 баллов. В настоящее время у меня есть рабочая группа, созданная для среднего количества ВСЕХ баллов, но мне нужны 10 последних. Могу ли я применить ограничение к выражению $ avg или есть лучший способ? Спасибо за любую помощь.

db = client.mathsgame4 
pipe = [{'$group': 
       {'_id': '$name', 
       'average': {'$avg': '$time'}, 
       } 
      }, 
      {'$sort': {'average': 1}}] 

res = db.results.aggregate(pipeline=pipe) 

for each in res: 
    print(each['_id'] + " average is " + "%.2f" % each['average']) 

ответ

1

Еще один вариант вы можете попробовать что-то вроде этого. Вы можете комбинировать $ avg и $ slice в стадии $ project.

aggregate([{ 
    '$sort': {'name': 1,'_created': -1} 
}, { 
    '$group': { 
     '_id': '$name', 
     'times': {'$push': '$time'}, 
    } 
}, { 
    '$project': { 
     'average': {'$avg': {'$slice': ['$times', 10]} 
     } 
    } 
}, { 
    '$sort': {'average': 1} 
}]) 
+0

Спасибо, что это тоже работает. –

Смежные вопросы