2013-05-01 3 views
1

몇 가지 몽고 데이터베이스 (일부는 콜렉션과 문서로 채워져 있고 일부는 비어 있음)가 있으며이를 분석하여 내용 그래프를 작성하려고합니다. 각 db, 각 컬렉션 및 컬렉션의 각 키에 대한 노드를 만들고 각 키에서 값 (페이지를 건너 뛰기)에 대한 노드를 만들 계획입니다. 다음은 그래프를 가져 오는 코드입니다.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) 

내 문제는 문 if (u'_id' in page.viewvalues()): 나는 내가 인쇄 수천 얻을 경우 문 앞에 페이지를 인쇄하지만 if 문은 항상 false 인 경우 내가 (페이지를 얻고 알고 있다면 난을 통과하지 것입니다. 무엇을 가지고 ? 나는 find() 쿼리 감사에서 반환 된 사전을 액세스하는 잘못한

편집 :.

아마도 언급해야하는 나는이

for i in page: 
뭔가를 할 때

대신에 if 문이 조금 작동하고 TypeError: unhashable type: 'dict'을 말하면서 페이지가 반환되지 않았거나 find() 페이지가 반환되지 않은 것으로 나타났습니다.

답변

1

이 나를 위해 작동합니다 (find()에 의해 반환되는) 커서 pymongo 이상 반복하면서

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 

당신은 항상 사전을 얻는다. 따라서 사전에 _id 키가 있는지 확인할 수 있습니다.

그런데 find()fields 인수를 제공하여 결과에서 볼 필드를 지정할 수 있습니다.

+0

데이터가없는 컬렉션이있는 경우 작동합니까? –

+0

그러면 find는 아무 것도 반환하지 않습니다. – alecxe

+0

어떻게 확인하나요? (편집에서 언급 한 dict 형식이 아니라는 오류를 던지고 있습니다.) –