Maison > Questions et réponses > le corps du texte
Trente mille données, chaque donnée ne contient qu'un nombre aléatoire {"chiffre": nombre aléatoire}
Exigence : comptez le nombre qui apparaît le plus de fois
Table de base de données
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))
Il faut cinq ou six minutes pour exécuter une fois. Utiliser le multithread pour exécuter 100 n'est pas beaucoup plus rapide. Le ventilateur est également très bruyant...
Quelle est la bonne posture ?
迷茫2017-05-17 10:05:55
La bonne posture est d'utiliser l'agrégation.
db.table.aggregate([
{$group: {_id: "$digit", count: {$sum: 1}}}, // 统计每个数字出现的次数
{$sort: {count: -1}}, // 逆序排列
{$limit: 1} // 取第1条记录
]);
Les utilisateurs du $group peuvent se référer à la documentation.
Il convient de noter que la possibilité qu'une telle demande apparaisse dans la réalité n'est pas élevée. On estime qu'il s'agit d'une question pratique pour vous. En fait, même si Aggregatoin est utilisé, il est toujours nécessaire de parcourir toutes les données de l'ensemble de la collection pour trouver le nombre le plus fréquent. Par conséquent, lorsque le nombre total d'enregistrements dans la collection est relativement important, une telle opération de parcours complet de la table est nécessaire. ne peut pas être rapide.Ce type de méthode de recherche n'est généralement disponible que dans les scénarios OLAP, et OLAP n'a généralement pas d'exigences de vitesse élevée. Par conséquent, le cadre d’agrégation devrait être utilisé uniquement à partir d’une discussion théorique, mais les besoins réels nécessitent encore une analyse détaillée.