hea*_*uln 4 python mongodb pymongo
tasks = list(self.collection.find().sort('_id',pymongo.DESCENDING).limit(1000))
Run Code Online (Sandbox Code Playgroud)
当我使用 pymongo 解决程序时遇到了麻烦。
文件“D:\Python27\lib\site-packages\pymongo-3.2.1-py2.7-win-amd64.egg\pymongo\cursor.py”,第 1097 行,在下一个文件“D:\Python27\lib\”中site-packages\pymongo-3.2.1-py2.7-win-amd64.egg\pymongo\cursor.py”,第 1039 行,在 _refresh 文件“D:\Python27\lib\site-packages\pymongo-3.2.1 -py2.7-win-amd64.egg\pymongo\cursor.py”,第 903 行,在 __send_message 文件“D:\Python27\lib\site-packages\pymongo-3.2.1-py2.7-win-amd64”中。 egg\pymongo\helpers.py”,第 133 行,在 _unpack_response bson.errors.InvalidBSON:'utf8' 编解码器无法解码位置 25 的字节 0xa1:无效的起始字节
tasks =self.collection.find().sort('_id',pymongo.DESCENDING).limit(1000)
for task in tasks: #If i use this way,it will also touch this problem
task = self.collection.find_one()#It would do so,too
Run Code Online (Sandbox Code Playgroud)
我进入pymongo找出原因。我发现问题可能是由以下代码引起的
result = {"cursor_id": struct.unpack("<q", response[4:12])[0],
"starting_from": struct.unpack("<i", response[12:16])[0],
"number_returned": struct.unpack("<i", response[16:20])[0],
"data": bson.decode_all(response[20:], codec_options)}
Run Code Online (Sandbox Code Playgroud)
在 pymongo helper.py 133 行中的 bson.decode_all 它显示了由关于 'oid' 的解码失败导致的问题?'oid' 是 mongo 中的 _id。然后我复制文档并使用新的 _id 创建相同的文档,然后我成功拿到了文件。
我如何解决“任务中的任务:”样式的问题。
使用的 pymongo 版本:3.2.1
您需要将 unicode_decode_error_handler 参数传递给 MongoClient 并至少使用 pymongo 3.5.1。
import pymongo
import json
from pymongo import MongoClient
if __name__ == '__main__':
client = MongoClient(
host="whatever_your_host_is",
maxPoolSize=50,
unicode_decode_error_handler='ignore'
)
my_db=client['my_db']
collection=my_db['my_collection']
cursor = collection.find({"whatever": "some_stuff"})
for document in cursor:
print(document)
Run Code Online (Sandbox Code Playgroud)
看起来“忽略”在 Python 2.7 上是默认设置的,但在 Python 3.6.1 中你必须自己做。这将忽略 Unicode 错误并让游标继续迭代,pymongo 将尽力重建 JSON 数据。
| 归档时间: |
|
| 查看次数: |
6325 次 |
| 最近记录: |