【问题标题】:Pymongo: Limiting the results used to calculate the average in a pipelinePymongo:限制用于计算管道中平均值的结果
【发布时间】:2017-01-07 21:04:23
【问题描述】:

我正在使用 pymongo 并尝试创建一个简单的平均值列表,其中我的集合仅包含大量名称和时间。 (它是一个简单的数学游戏,其中存储了您正确回答问题的速度)。

每个结果都通过 python-eve 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'])

【问题讨论】:

    标签: python mongodb mongodb-query aggregation-framework


    【解决方案1】:

    还有一个选项,您可以尝试这样的事情。您可以在 $project 阶段组合 $avg 和 $slice。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多