我不了解mongodb,我只是想问一下是否有可能,如果可能的话,我该怎么做。我的问题是我们怎么知道游标何时到期。是否有用于此目的的API?
对于任何意见和建议,我将不胜感激。
祝你好运。
答案 0 :(得分:5)
来自MongoDB文档:
默认情况下,当客户端耗尽游标中的所有结果时,MongoDB将自动关闭游标。但是,对于上限集合,您可以使用在客户端在初始游标中耗尽结果后保持打开的Tailable Cursor。
http://docs.mongodb.org/manual/tutorial/create-tailable-cursor/
可能导致游标过期的其他因素是batchSize和timeout。总结一下光标到期的因素是:
答案 1 :(得分:1)
通常,光标在一段时间(大约10分钟)后在数据库服务器上“死”,并在客户端耗尽所有结果时关闭。
某些驱动程序有一个“不朽”选项,它在设置NoTimeout
选项的Java驱动程序中具有相同的功能:
dbcoll.find(...).addOption(Bytes.QUERYOPTION_NOTIMEOUT)
如果您打算在这段时间内保持打开的光标,请按上述方式设置。
http://api.mongodb.org/java/current/com/mongodb/Bytes.html#QUERYOPTION_NOTIMEOUT
答案 2 :(得分:1)
我遇到了这个帖子,正在寻找pymongo
CursorNotFound: Cursor not found, cursor id
中出现以下错误的解决方案。显然原因与此线程相同,但没有为pymongo
提供解决方案。
在pymongo文档中的常见问题解答中,以下链接回答了问题:here和here。
最快的解决方案是禁用超时,因此服务器不会使光标到期,并且它始终有效。
client = MongoClient("localhost")
db = client.testdatabase
cursor = db.testcollection.find({}, no_cursor_timeout=True)
在find()文档中,您可以通过更改光标类型找到备选方案:
cursor_type(可选):要返回的游标类型。有效 选项由CursorType定义:
- NON_TAILABLE - 此查找调用的结果将在结果集上返回标准光标。
- TAILABLE - 此查找调用的结果将是一个tailable游标 - tailable游标仅用于上限集合。当检索到最后一个数据但它们保持打开状态时,它们不会关闭 光标位置标记最终文档位置。如果有更多数据 收到的光标迭代将从最后一个文件继续 接收。有关详细信息,请参阅tailable游标文档。
- TAILABLE_AWAIT - 此查找调用的结果将是一个设置了await标志的tailable游标。服务器将等待几秒钟 返回完整的结果集后,它可以捕获并返回 在查询期间添加了其他数据。
- EXHAUST - 此查找调用的结果将是一个排气光标。 MongoDB将批量处理的结果流式传输到客户端而无需等待 客户端请求每批次,减少延迟。见附注 兼容性如下。
更新:使用no_cursor_timeout
后,我想知道光标未执行时会发生什么。这是答案:PyMongo: What happens to cursor when no_cursor_timeout=True