2014-04-21 3 views
0

Je suis nouveau à MongoDB. J'essaie de lire les données de plusieurs collections. Je veux faire quelques statistiques sur GHTorrent, donc j'essaye d'imprimer un .csv avec les données qui m'intéressent. Le problème est que ma requête fonctionne depuis 30 minutes et je suis sûr que ma recherche est moins efficace que cela pourrait être, je ne suis pas sûr de savoir comment l'améliorer.Accélérez requête Python MongoDB

Tout d'abord, je

closed_issues = ghdb.issues.find(
    { "state": "closed" }, # query criteria 
    { #projection 
    "id": 1, 
    "created_at": 1, 
    "closed_at": 1, 
    "comments": 1, 
    "repo": 1, 
    "owner": 1, 
    "number": 1, 
    } 

Puis, après l'ouverture d'un fichier et la rédaction de titres, je

for issue in closed_issues: 
    countMentioned = ghdb.issue_events.find({ 
     "issue_id": issue['number'], 
     "repo": issue['repo'], 
     "owner": issue['owner'], 
     "event": "mentioned" }).count(); 
    countSubscribed = ghdb.issue_events.find({ 
     "issue_id": issue['number'], 
     "repo": issue['repo'], 
     "owner": issue['owner'], 
     "event": "subscribed" }).count(); 
    countAssigned = ghdb.issue_events.find({ 
     "issue_id": issue['number'], 
     "repo": issue['repo'], 
     "owner": issue['owner'], 
     "event": "assigned" }).count(); 
    time_created = parser.parse(issue['created_at']) 
    time_closed = parser.parse(issue['closed_at']) 
    timediff = time_closed - time_created; 

    f.write(
     str(issue['id']) +","+ 
     str(issue['number']) +","+ 
     str(issue['repo']) +","+ 
     str(issue['owner']) +","+ 
     str(timediff.total_seconds()) +","+ 
     str(issue['comments']) +","+ 
     str(countMentioned) +","+ 
     str(countSubscribed) +","+ 
     str(countAssigned) +'\n' 
     ) 

Comme vous pouvez le voir, j'utiliser trois des quatre mêmes critères pour trois trouve par numéro. Quel est le moyen le plus efficace de faire une recherche pour une combinaison de issue_id, repo et owner et de faire des comptes pour chacun des trois différents event?

Répondre

1

Le cadre d'agrégation de MongoDB est un excellent outil pour les requêtes qui produisent des statistiques agrégées comme compte - http://docs.mongodb.org/manual/core/aggregation/

Je commencerais là-bas et jouer avec un peu. Pour ce genre de cas d'utilisation, vous pouvez généralement commencer par là, puis encapsuler un peu de code supplémentaire autour du résultat pour exporter les données dans le format dont vous avez besoin.