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

三萬個資料, 每個資料只包含一個隨機數 {"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

学习是最好的投资!

全部回覆(1)
迷茫

正確的姿勢是使用aggregation.

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

$group的使用者可以參考文件。
要注意的是,這樣的需求現實當中出現的可能性不高,估計你這是一道練習題目。實際上就算使用了Aggregatoin,仍然需要遍歷整個集合的所有數據才有可能找出出現最多的數字,所以當集合總記錄數比較大的時候,這樣的全表遍歷操作怎麼樣都不可能會快,通常只有在OLAP場景下才有這樣的查法,而OLAP通常對速度要求不高。所以僅從理論上討論,應該使用aggregation framework,但真實需求還是需要再做具體分析。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板