当前位置: 首页 > 面试题库 >

pymongo.errors.CursorNotFound:游标ID“ ...”在服务器上无效

宗建章
2023-03-14
问题内容

我正在尝试使用以下代码获取mongo数据库中存在的一些ID:

client = MongoClient('xx.xx.xx.xx', xxx)
db = client.test_database
db = client['...']
collection = db.test_collection
collection = db["..."]


for cursor in collection.find({ "$and" : [{ "followers" : { "$gt" : 2000 } }, { "followers" : { "$lt" : 3000 } }, { "list_followers" : { "$exists" : False } }] }): 
    print cursor['screenname']
    print cursor['_id']['uid']
    id = cursor['_id']['uid']

但是,过了一会儿,我收到此错误:

pymongo.errors.CursorNotFound:游标ID’…’在服务器上无效。

我发现这篇文章提到了这个问题。不过,我不清楚该采取哪种解决方案。可以使用find().batch_size(30)吗?上面的命令到底是做什么的?我可以使用所有数据库IDbatch_size吗?


问题答案:

由于光标在服务器上超时(不活动10分钟后),因此出现此错误。

从pymongo文档中:

如果MongoDB中的游标已打开很长时间而未对其执行任何操作,则它们可能会在服务器上超时。尝试迭代游标时,这可能导致引发CursorNotFound异常。

当您调用该collection.find方法时,它查询一个集合,并将光标返回到文档。要获取文档,请迭代光标。当您遍历游标时,驱动程序实际上是在向MongoDB服务器发出请求以从服务器获取更多数据。每个请求中返回的数据量由batch_size()方法设置。

从文档中:

限制一批中返回的文档数。每个批次都需要往返服务器。可以对其进行调整以优化性能并限制数据传输。

将batch_size设置为较小的值将帮助您解决超时错误错误,但是它将增加访问MongoDB服务器获取所有文档的次数。

默认批处理大小:

对于大多数查询,第一批返回101个文档或刚好超过1兆字节的文档。批处理大小不会超过BSON文档的最大大小(16 MB)。

没有通用的“正确”批次大小。您应该使用不同的值进行测试,并查看适合您的用例的合适值,即在10分钟的窗口中可以处理多少个文档。

不得已而为您no_cursor_timeout=True。但是,您需要确保在处理完数据后关闭游标。

如何避免以下情况try/except

cursor = collection.find(
     {"x": 1},
     no_cursor_timeout=True
)
for doc in cursor:
    # do something with doc
cursor.close()


 类似资料:
  • 问题内容: 我正在尝试遍历此循环: 我在第100,000个以上的记录中收到以下错误。 这个错误是什么意思? 问题答案: 也许光标在服务器上超时了。要查看这是否是问题,请尝试将timeout = False设置为: 参见http://api.mongodb.org/python/1.6/api/pymongo/collection.html#pymongo.collection.Collection

  • 我试图建立一个通用服务器总是在连接的客户端。 该体系结构由4个主要组件组成 有状态应用服务器 无状态网关服务器 客户排队 系统和经纪人 工艺流程 客户端连接到网关 我正在使用JavaNetty作为网关。appserver也是用Java编写的。 我很想说这个设计像Mongrel2,但我不能完全确定。我想说,这更符合城市飞艇氦边缘服务器的设计(http://urbanairship.com/blog/

  • JAGS 游戏服务器是一个开源的 Java / AS 3.0 的游戏服务器,支持多玩家、碰撞检测以及键盘事件等等。

  • MySQL连接器-J文档(此处)提到了JDBC从MySQL数据库检索结果的两种方式。一种是默认操作,其中整个结果集被加载到内存中,并在代码中可访问。第二种是逐行流。 我想知道最新版本的MySQL / MySQL JDBC是否支持服务器端游标。具体来说,我想知道这些选项是否和

  • 问题内容: 我将Selenium与Java(1.8)中的Chromedriver结合使用来进行一些自动的网络爬网: 我正在尝试迁移到Ubuntu 16.04服务器。在服务器上,我安装了Ubuntu chromedriver版本2.37,chrome版本65。根据chromedriver文档,这些版本兼容。我已经更改了指定chromedriver在Ubuntu中的位置的代码: 在运行程序之前,我先启

  • 我想设置两台运行jstatd的服务器,这样我就可以动态监控我的应用程序。web服务器已经启动并运行,但另一台服务器总是会出现这样的异常。 无法将/JStatRemoteHost绑定到RMI注册表java。rmi。ServerException:服务器线程中发生RemoteException;嵌套的例外是:java。rmi。解组异常:错误解组参数;嵌套的例外是:java。lang.ClassNotF