在python中迭代mongo文档

时间:2012-05-01 21:28:47

标签: python mongodb pymongo mongodb-query

请查看以下代码:

collection = db_name.get_db().collection_name
print collection
# prints .. Collection(Database(Connection('localhost', 27017), u'db_name'), u'colelction_name')


for key in some_dict.keys():
        query = {"p_id":key}
        document = collection.find(query)
        print document
        # gives <pymongo.cursor.Cursor object at 0x7f13f3049b10>

现在我想要检索这个文件..并获取数据。 但如果我这样做:

       for d in document:
            print d

我收到以下错误

    File "/usr/local/lib/python2.7/dist-packages/pymongo/cursor.py", line 703, in next
   if len(self.__data) or self._refresh():
 File "/usr/local/lib/python2.7/dist-packages/pymongo/cursor.py", line 666, in _refresh
self.__uuid_subtype))
  File "/usr/local/lib/python2.7/dist-packages/pymongo/cursor.py", line 628, in __send_message
self.__tz_aware)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/helpers.py", line 101, in _unpack_response
error_object["$err"])

我做错了什么? 感谢

3 个答案:

答案 0 :(得分:1)

您想要检索&#34;此文件&#34; - 然后使用官方方法获取符合条件的一个文档:find_one():

http://api.mongodb.org/python/2.2/api/pymongo/collection.html

阅读基本API文档是您的朋友。

答案 1 :(得分:1)

另外,请注意pymongo有几个可用于光标的构造函数选项:

https://github.com/mongodb/mongo-python-driver/blob/master/pymongo/cursor.py

其中一些选项(例如await_data,exhaust)在加速光标迭代方面会有很大的不同。

根据查询的长度和复杂程度,您还可以在单​​独的线程中处理数据,以便尽可能快地运行游标,同时触发异步任务。

我发现运行单个线程来耗尽mongo游标,使用单独的线程处理来自它的数据可以大大提高游标吞吐量,无论游标带来的数据量如何。

答案 2 :(得分:0)

当API和mongo提供适合此问题的查询时,我不明白为什么要尝试使用这种方法获取一批文档?

如果some_dict.keys()返回一个id列表,并且你想要检索与那些id匹配的文档,为什么不使用正确的“in”查询呢?

docs = collection.find({'p_id': {'$in':some_dict.keys()}})
print docs
# <pymongo.cursor.Cursor object at 0x10112dfd0>
print [d for d in docs]
# [{DOC1}, {DOC2}, {...}]

正如@ich推荐的那样,pymongo api文档解释了所有内容,并阅读了mongodb查询语言。

如果这不是您想要的,那么您的意图在您的问题中并不明确。它看起来只是想要获得一组匹配id

列表的文档