我正在try 获取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']

然而,过了一会儿,我收到了这个错误:

皮Mongo .错误.CursorNotFound:光标id"…"在服务器上无效.

我找到了这个article,它指的是那个问题.然而,我不清楚该采取哪种解决方案.可以用find().batch_size(30)吗?上面的命令具体是做什么的?我可以使用batch_size获取所有数据库ID吗?

推荐答案

出现此错误是因为服务器上的光标超时(10分钟不活动后).

从pymongo文档中:

MongoDB中的游标可以在服务器上超时,如果它们已经打开了一段时间

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

documentation人中:

限制一批中返回的文档数.每批

将batch_size设置为较低的值将有助于解决超时错误,但会增加访问MongoDB服务器以获取所有文档的次数.

默认批量大小:

对于大多数查询,第一批返回101个文档或刚刚足够

没有通用的"正确"批量大小.您应该使用不同的值进行测试,看看什么是适合您的用例的适当值,即在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()

Mongodb相关问答推荐

在MongoDB集合中按文档内的频率对数组排序

当日期和时间在不同键的字符串中时,Mongo 查询过滤今天的数据

使用特定关键字和邻近度进行查询和过滤

分组前的 MongoDb 聚合总数

定期自动轮换 MongoDb 集合

分页时根据唯一字段mongodb获取数据

Mongo:投影不影响布尔值

MongoDB C# 驱动程序 2.0 InsertManyAsync 与 BulkWriteAsync

从 node.js 的 mongodb 集合中删除文档

使用绝对类型在 Typescript 中编写 Mongoose 的类型化模型和模式的类和接口

如何将记录从一个 mongo 数据库插入另一个?

MongoDB 的 BinData(0, "e8MEnzZoFyMmD7WSHdNrFJyEk8M=") 中的0是什么意思?

pymongo 排序和 find_one 问题

用 BsonRepresentation(BsonType.ObjectId) vs BsonId vs ObjectId 在 C# 中装饰属性之间的区别

将 mongoose 字符串模式类型默认值设为空白并使该字段可选

Node.js MongoDB Upsert 更新

MongoDb:如何将附加对象插入对象集合?

插入违反唯一索引的 MongoDB 文档时如何捕获错误?

在 mongodb 中插入当前日期时间

MongoDB MapReduce - 发出一个键/一个值不调用reduce