问题描述
三万条数据, 每条数据只包含一个随机数 {'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 += 1if __name__ == ’__main__’: start = time.time() main() print(’Cost: {}’.format(time.time() - start))
运行一次需要五六分钟吧, 用多线程开100也快不了多少, 风扇还特响...请问正确姿势是怎样的
问题解答
回答1:正确的姿势是使用aggregation.
db.table.aggregate([ {$group: {_id: '$digit', count: {$sum: 1}}}, // 统计每个数字出现的次数 {$sort: {count: -1}}, // 逆序排列 {$limit: 1} // 取第1条记录]);
$group的用户可以参考文档。需要注意的是,这样的需求现实当中出现的可能性不高,估计你这是一道练习题目。实际上就算使用了Aggregatoin,仍然需要遍历整个集合的所有数据才有可能找出出现最多的数字,所以当集合总记录数比较大的时候,这样的全表遍历操作怎么样都不可能会快,通常也只有在OLAP场景下才有这样的查法,而OLAP通常对速度要求不高。所以仅从理论上讨论,应该使用aggregation framework,但是真实需求还是需要再做具体分析。