tasks = list(self.collection.find().sort('_id',pymongo.DESCENDING).limit(1000))
当我使用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
我走进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)}
在pymongo helper.py 133行 在bson.decode_all中,它显示了解码失败导致的问题,关于&#39; oid&#39; oid&#39;是mongo中的_id。然后我复制文档并使用新的_id制作相同的文档,然后我成功获取文档。
如何通过&#34;解决任务中的任务问题:&#34;风格。
使用的pymongo版本:3.2.1
答案 0 :(得分:3)
我最近有类似的错误消息,很难找到它的帮助。
我解决了我的问题,降低了3.0以下的pymongo版本。 changelog of pymongo在版本3.0中宣传“重写的纯Python BSON实现”。我发现新的实现在以BSON格式序列化时无法管理python utf8和unicode编码。
答案 1 :(得分:3)
我正在使用Python 3.6,pymongo 3.4.0。
根据文档,您可以使用'with_options'方法克隆集合,这对我来说很有用:
col_article = col_article.with_options(codec_options = bson.CodecOptions(unicode_decode_error_handler="ignore"))
答案 2 :(得分:3)
您需要将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)
看起来像是&#39;忽略&#39;在Python 2.7上默认设置,但在Python 3.6.1中你必须自己完成。这将忽略Unicode错误并让光标继续迭代,pymongo将尽力重建JSON数据。