请查看以下代码:
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"])
我做错了什么? 感谢
答案 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
列表的文档