如何在MongoEngine中设置maxIdleTimeMS解决CursorNotFound错误
环境
- MongoEngine版本: 0.27.0
- Python版本: 3.9.10
- MongoDB服务器版本: 5.0.15
问题
项目里用MongoEngine和MongoDB交互,最近日志里频繁出现这个错误:
pymongo.errors.CursorNotFound: Cursor not found
解决思路与方案
原因
这个错误是因为MongoDB的游标超时了——MongoDB默认10分钟后会自动关闭闲置的游标,要是你拿到游标后长时间没操作,或者处理数据的速度太慢超过了这个时限,就会触发报错。
具体解决办法
- 延长游标超时时间
查询时加上no_cursor_timeout=True参数,让游标不会自动超时,但用完必须手动关闭,不然会占用MongoDB资源:
docs = MyModel.objects().no_cursor_timeout() try: for doc in docs: # 处理你的数据逻辑 pass finally: docs._cursor.close() # 手动关闭游标
- 优化数据处理速度
如果单条数据处理耗时太长,就算延长超时也可能出问题。可以试试:
- 用
limit()减少单次查询返回的数据量,分批处理 - 简化数据处理逻辑,或者把复杂计算改成异步执行
- 设置批量拉取大小
用batch_size()指定每次从MongoDB拉取的数据量,避免一次性拉太多数据拖慢处理速度:
docs = MyModel.objects().batch_size(100) for doc in docs: # 处理数据 pass
- 检查未关闭的游标
要是代码里有遗漏关闭的游标,积累多了会导致MongoDB资源紧张,间接引发这类问题。排查所有使用游标的地方,确保都有正确的关闭逻辑。
内容的提问来源于stack exchange,提问作者Dylan
相关产品推荐
相关产品推荐

