根据MongoDB官方文档,当一个未显式关闭的游标被垃圾回收时,会自动关闭游标。根据 Motor 文档,当游标关闭时,会自动发送一个'killCursors”命令。这样,如果在游标返回检索结果之前存在网络中断或MongoDB服务不可用,将会引发异常。可以使用异步迭代器来避免这种情况。
以下是使用异步迭代器遍历游标的示例代码:
import asyncio
from motor.motor_asyncio import AsyncIOMotorClient
async def main():
client = AsyncIOMotorClient()
db = client.test_database
collection = db.test_collection
async with collection.find().batch_size(10) as cursor:
async for document in cursor:
# do something with document
pass
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
使用异步迭代器遍历游标时,当网络中断或MongoDB服务不可用时,会自动重试。如果发生可重试的读取错误,Motor库会自动重试以最长达30秒的时间,这意味着它会自动处理fetch_next失败的情况。