在php中的页面请求之间保留mongodb游标

时间:2013-11-13 17:00:25

标签: php mongodb

我有一个非常大的数据集,我使用批处理导出,以防止页面超时。整个过程可能需要一个多小时,我正在使用drupal批处理,它基本上重新加载页面,其中包含进程已完成的状态。每个页面请求实质上再次运行查询,其中包括需要一段时间的排序。然后它将数据导出到临时文件。下一页加载运行完整的mongo查询,排序,跳过已导出的条目,并将更多内容导出到临时文件。问题是每个页面加载使mongo重新运行整个查询和排序。我希望能够让下一个批处理页面在它停止的地方拾取相同的光标并继续拉下一组结果。

2 个答案:

答案 0 :(得分:1)

cursor.skip()的MongoDB手册条目提供了一些建议:

  

考虑对这些类型的任务使用基于范围的分页。也就是说,查询一系列对象,使用应用程序中的逻辑来确定分页而不是数据库本身。如果您不需要轻松跳转到特定页面,则此方法具有更好的索引利用率。

例如,如果您的夜间批处理过程在过去24小时内累积的数据上运行,也许您可​​以运行基于日期范围的查询(可能每天一小时一次)并以这种方式处理您的数据。我假设你的数据包含每个文档的某种可用时间戳,但你明白了。

答案 1 :(得分:0)

虽然游标存在于服务器上并且仅在大约10分钟无活动后才会超时,但PHP驱动程序不支持请求之间持久的游标。

在每个请求结束时,驱动程序将终止在该请求期间创建的所有尚未用尽的游标。 当删除对MongoCursor对象的所有引用(例如$ cursor = null)时,也会发生这种情况。

这样做是因为不幸的是应用程序不会遍历整个游标,并且我们不想在服务器上留下未使用的游标,因为它可能会影响性能。

对于您的具体情况,work around this problem的最佳方法是改进索引,以便加快光标加载速度。 您可能还希望仅选择数据的某个子集,这样您就可以在固定点之间请求数据。

说,对于报告,您的第一个请求可能要求从凌晨1点到凌晨2点的所有数据。 然后你的下一个请求从凌晨2点到凌晨3点要求所有数据,依此类推,就像Saftschleck解释的那样。

您可能还想查看聚合框架,该框架旨在进行"在线报告":http://docs.mongodb.org/manual/aggregation/