pymongo - bson.errors.InvalidDocument 只是有时没有明显原因引发

pymongo - bson.errors.InvalidDocument raised only sometimes for no apparent reason

我的文档是这样的:{ "_id" : 5, "hunger" : 5, "energy" : 50 }

我正在调用这个函数..

def getEnergy(_id) -> int:
    record = db.systems.find({"_id":_id}) # systems is the collection
    return record[0]['energy']

出现这个错误..

  (...)
  File "C:\Users\mateo\AppData\Roaming\Python\Python39\site-packages\pymongo\cursor.py", line 692, in __getitem__
    for doc in clone:
  File "C:\Users\mateo\AppData\Roaming\Python\Python39\site-packages\pymongo\cursor.py", line 1238, in next
    if len(self.__data) or self._refresh():
  File "C:\Users\mateo\AppData\Roaming\Python\Python39\site-packages\pymongo\cursor.py", line 1155, in _refresh
    self.__send_message(q)
  File "C:\Users\mateo\AppData\Roaming\Python\Python39\site-packages\pymongo\cursor.py", line 1044, in __send_message
    response = client._run_operation(
  File "C:\Users\mateo\AppData\Roaming\Python\Python39\site-packages\pymongo\mongo_client.py", line 1424, in _run_operation
    return self._retryable_read(
  File "C:\Users\mateo\AppData\Roaming\Python\Python39\site-packages\pymongo\mongo_client.py", line 1525, in _retryable_read
    return func(session, server, sock_info, secondary_ok)
  File "C:\Users\mateo\AppData\Roaming\Python\Python39\site-packages\pymongo\mongo_client.py", line 1420, in _cmd
    return server.run_operation(
  File "C:\Users\mateo\AppData\Roaming\Python\Python39\site-packages\pymongo\server.py", line 98, in run_operation
    message = operation.get_message(
  File "C:\Users\mateo\AppData\Roaming\Python\Python39\site-packages\pymongo\message.py", line 351, in get_message
    request_id, msg, size, _ = _op_msg(
  File "C:\Users\mateo\AppData\Roaming\Python\Python39\site-packages\pymongo\message.py", line 743, in _op_msg
    return _op_msg_uncompressed(
bson.errors.InvalidDocument: cannot encode object: <pymongo.cursor.Cursor object at 0x0000021E52535670>, of type: <class 'pymongo.cursor.Cursor'>

有时函数运行良好,有时会抛出错误。好像是服务器的问题,但是我也搞不清楚到底是什么问题。

如果错误出在该函数中(我们无法 100% 判断,因为您只发布了一半的堆栈跟踪),您将在将游标传递到函数中时收到此错误;此代码段重现错误:

from pymongo import MongoClient

db = MongoClient()['mydatabase']

def getEnergy(_id) -> int:
    record = db.systems.find({"_id":_id}) # systems is the collection
    return record[0]['energy']

foo = db.somecollection.find()
getEnergy(foo)

错误:

bson.errors.InvalidDocument: cannot encode object: <pymongo.cursor.Cursor object at 0x0000019DB0A0B070>, of type: <class 'pymongo.cursor.Cursor'>

您需要检查调用的位置 getExport() 并检查您传入的参数不是游标对象。