PyMongo,图形

时间:2013-05-01 04:32:29

标签: python mongodb pymongo

我有几个mongo数据库(一些填充了集合和文档,有些是空的),我正在尝试解析它们并为内容创建一个图形。我打算为每个数据库,每个集合和集合中的每个键创建节点,并从每个键为值创建节点(因此跳过页面)。这是我获取图表的代码。

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语句if (u'_id' in page.viewvalues()):我知道我正在获取页面(如果我在if语句之前打印页面,我会得到几千页,但if语句总是错误的。我在访问find()查询返回的字典时做错了吗?谢谢。

编辑:

我应该提一下,当我做这样的事情时

for i in page:

而不是if语句它有效,然后打破说TypeError: unhashable type: 'dict',我认为这是在它打到一个空页面或当find()没有返回任何页面时。

1 个答案:

答案 0 :(得分:1)

这对我有用:

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

在迭代pymongo游标(由find()返回)时,你总是得到一本字典。因此,您只需检查字典中是否有_id键。

顺便说一句,您可以通过向fields提供find()参数来指定要在结果中查看的字段。