mongodb - pymongo count 很慢
PHPz
PHPz 2017-05-17 10:03:55
0
1
1057

三万条数据, 每条数据只包含一个随机数 {"digit": 随机数}
要求: 统计出现最多次数的数字
数据库表 table

def main():
    digits = []
    for d in table.find():
        n = d['digit']
        digits.append(n)
    dig = set(digits)

    news = []
    i = 0
    for d in dig:
        c = table.find({"digit": d}).count()
        zz = (d, c)
        news.append(zz)
        print(i)
        i += 1

if __name__ == '__main__':
    start = time.time()
    main()
    print('Cost: {}'.format(time.time() - start))

运行一次需要五六分钟吧, 用多线程开100也快不了多少, 风扇还特响...
请问正确姿势是怎样的

PHPz
PHPz

学习是最好的投资!

répondre à tous(1)
迷茫

正确的姿势是使用aggregation.

db.table.aggregate([
    {$group: {_id: "$digit", count: {$sum: 1}}},    // 统计每个数字出现的次数
    {$sort: {count: -1}},    // 逆序排列
    {$limit: 1}    // 取第1条记录
]);

$group的用户可以参考文档。
需要注意的是,这样的需求现实当中出现的可能性不高,估计你这是一道练习题目。实际上就算使用了Aggregatoin,仍然需要遍历整个集合的所有数据才有可能找出出现最多的数字,所以当集合总记录数比较大的时候,这样的全表遍历操作怎么样都不可能会快,通常也只有在OLAP场景下才有这样的查法,而OLAP通常对速度要求不高。所以仅从理论上讨论,应该使用aggregation framework,但是真实需求还是需要再做具体分析。

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!