【问题标题】:UnicodeDecodeError while iterating over MongoDB collection迭代 MongoDB 集合时出现 UnicodeDecodeError
【发布时间】:2012-09-25 12:20:37
【问题描述】:

我正在尝试使用 Python 2.7 和 pymongo-2.3 查询 MongoDB 数据库,使用如下:

from pymongo import Connection

connection = Connection()
db = connection['db-name']
collections = db.subName
entries = collections['collection-name']
print entries 
# > Collection(Database(Connection('localhost', 27017), u'db-name'), u'subName.collection-name')

for entry in entries.find():
    pass

即使我没有对 entry 对象做任何事情,迭代器也会失败:

Traceback (most recent call last):
File "/Users/../mongo.py", line 27, in <module>
  for entry in entries.find():
File "/Library/Python/2.7/site-packages/pymongo-2.3-py2.7-macosx-10.8-intel.egg/pymongo/cursor.py", line 778, in next
File "/Library/Python/2.7/site-packages/pymongo-2.3-py2.7-macosx-10.8-intel.egg/pymongo/cursor.py", line 742, in _refresh
File "/Library/Python/2.7/site-packages/pymongo-2.3-py2.7-macosx-10.8-intel.egg/pymongo/cursor.py", line 686, in __send_message
File "/Library/Python/2.7/site-packages/pymongo-2.3-py2.7-macosx-10.8-intel.egg/pymongo/helpers.py", line 111, in _unpack_response
UnicodeDecodeError: 'utf8' codec can't decode byte 0xfc in position 744: invalid start byte

我不是我要查询的数据库的创建者。 有人知道我做错了什么以及如何解决吗?谢谢。


更新:我设法使用try-except 跳过了来自pymongo/helpers.py 的违规行,但我更喜欢不涉及数据丢失的解决方案。

try:
    result["data"] = bson.decode_all(response[20:], as_class, tz_aware, uuid_subtype)
except:
    result["data"] = []

【问题讨论】:

    标签: python mongodb python-2.7 pymongo


    【解决方案1】:

    你能用 mongo shell 试试同样的操作吗?我想弄清楚它是特定于 Python 的,还是数据库中的损坏:

    $ mongo db-name  
    > var collection = db.getCollection('subName.collection-name')  
    > collection.find().forEach(function(doc) { printjson(doc); })
    

    【讨论】:

    • 抱歉耽搁了。尝试collection.find().forEach(function(doc) {print("1");}) 的速度,没有错误。看来是和 Python 相关的。
    • 好的,你能用 Python 写for entry in entries.find().sort([('_id', 1)]): print entry['_id'] 吗?这将在有问题的文档之前为您提供 _id。然后将 _id 放入 shell 中,collection.findOne({_id: {$gt: my_id}}) 并在此处发布。
    • 令人惊讶的是,这现在在控制台中失败了(也在 Python 中):collection.findOne({_id: {$gt: ObjectId("4ebcd5f0ed7c5031a103ba68")}}) 我不知道为什么我第一次尝试时没有抓住这个。 decode failed. probably invalid utf-8 string -- 一堆垃圾 -- why: TypeError: UTF-8 character 0x1234567 too large src/mongo/shell/utils.js:1018
    • Mongo 自己的数据文件肯定有损坏。您是否遇到过崩溃或不干净的关闭,或者您是否在 mongod 日志文件中看到错误?您可以尝试关闭,备份数据文件,使用 --repair 重新启动吗?:es.wiki.mongodb.org/display/DOCS/Durability+and+Repair
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多