2013-05-01 3 views
1

J'ai plusieurs bases de données mongo (certaines peuplées de collections et de documents, certaines vides) et j'essaie de les analyser et de créer un graphique pour le contenu. Je prévois de créer des noeuds pour chaque db, chaque collection et chaque clé de la collection, et de chaque clé pour la valeur (en sautant ainsi les pages). Voici mon code pour obtenir le graphique.PyMongo, Graphing

for db in dbs: 
    G.add_node(db) 
    for col in c[db].collection_names(): 
    G.add_node(col) 
    G.add_edge(db, col, weight = 0.9) 
    for page in c[db][col].find(): 
     if (u'_id' in page.viewvalues()): 
     pprint.pprint(page) 
     G.add_node(page[u'_id']) 
     G.add_edge(col, page[u'_id'], weight = 0.4) 
     for key, value in page.items(): 
      G.add_node(key) 
      G.add_edge(col, key, weight = 0.1) 
      G.add_node(value) 
      G.add_edge(key,value) 

Mon problème est que je ne passe l'instruction if if (u'_id' in page.viewvalues()): Je sais que je reçois des pages (si j'imprimer les pages avant l'instruction if je reçois quelques milliers imprimés, mais l'instruction if est toujours faux. Qu'ont je fait de mal à accéder au dictionnaire retour de la requête find() Merci

EDIT:.

Je devrais probablement mentionner aussi que quand je fais quelque chose comme ça

for i in page: 

au lieu de la de l'instruction if il fonctionne pour un peu, puis se brise en disant TypeError: unhashable type: 'dict' et j'ai pensé que c'était quand il a frappé une page vide ou lorsque find() n'a renvoyé aucune page.

Répondre

1

Cela fonctionne pour moi:

import pymongo 

c = pymongo.Connection() 
dbs = c.database_names() 

for db in dbs: 
    for col in c[db].collection_names(): 
     for page in c[db][col].find(): 
      if '_id' in page: 
       for key, value in page.iteritems(): 
        print key, value 

Vous obtenez un dictionnaire toujours en itérer sur pymongo curseur (qui est retourné par find()). Ainsi, vous pouvez juste vérifier s'il y a une clé _id dans le dictionnaire. Par ailleurs, vous pouvez spécifier les champs à voir dans les résultats en fournissant l'argument fields au code find().

+0

Est-ce que cela fonctionne lorsque vous avez une collection qui ne contient aucune donnée? –

+0

Ensuite, trouver ne retournera rien. – alecxe

+0

comment vérifiez-vous cela? (Il lance cette erreur en disant pas un type de dict que j'ai mentionné dans l'édition) –