我正在尝试使用以下代码获取 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']
但是,过了一会儿,我收到此错误:
我发现这个 article 指的是那个问题。然而,我不清楚采取哪种解决方案。是否可以使用
find().batch_size(30)
?上面的命令究竟是做什么的?我可以使用 batch_size
获取所有数据库 ID 吗? 最佳答案
您收到此错误是因为光标在服务器上超时(闲置 10 分钟后)。
从 pymongo 文档:
当您调用 collection.find
方法时,它会查询一个集合并返回一个指向文档的游标。要获取文档,请迭代游标。当您遍历游标时,驱动程序实际上是在向 MongoDB 服务器发出请求以从服务器获取更多数据。每个请求中返回的数据量由 batch_size()
方法设置。
从 documentation :
将 batch_size 设置为较低的值将帮助您解决超时错误,但它会增加您访问 MongoDB 服务器以获取所有文档的次数。
默认批量大小:
没有通用的“正确”批量大小。您应该使用不同的值进行测试,看看适合您的用例的值是什么,即在 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()
关于python - pymongo.errors.CursorNotFound : cursor id '...' not valid at server,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24199729/