在php中在页面请求之间持久化mongodb游标

在php中在页面请求之间持久化mongodb游标,php,mongodb,Php,Mongodb,我有一个非常大的数据集,我正在使用批处理导出它,以防止页面超时。整个过程可能需要一个多小时,我正在使用drupal batch,它基本上会重新加载页面,并显示过程完成的程度。每个页面请求基本上都会再次运行查询,其中包含一个需要一段时间的排序。然后将数据导出到临时文件。下一个页面加载将运行完整的mongo查询、排序、跳过已导出的条目,并将更多内容导出到临时文件。问题是每个页面加载都会使mongo重新运行整个查询和排序。我希望下一个批处理页面能够在停止的位置拾取相同的光标,并继续提取下一组结果。的M

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

的MongoDB手动输入提供了一些建议:

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


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

尽管游标位于服务器上,只有在大约10分钟没有活动后才会超时,但PHP驱动程序不支持在请求之间持久化游标

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

这样做是因为应用程序不在整个游标上迭代非常常见,我们不希望在服务器上留下未使用的游标,因为这可能会影响性能

对于您的特定情况,解决此问题的最佳方法是改进索引,以便更快地加载光标。 您可能还希望只选择数据的某个子集,这样您就有了一个固定点,可以在其中请求数据

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


您可能还想研究聚合框架,该框架旨在进行“在线报告”:

问题是,这是为网站上的多个客户生成的报告,他们可能需要按日期或名称对数据进行排序。考虑到按名称排序时每个字母的条目分布不均。如果记录数不满足要求,我认为这会给重新查询带来更大的复杂性。我想到的一种可能性是创建一个临时套接字,并让mongo通过该套接字进行连接,但我认为这需要编写一个新的连接包装器,它根本不使用mongo php驱动程序,并且必须对原始结果进行json解码,mongo确实会让光标保持活动状态一段时间,并给它一个唯一的ID。但是php驱动程序无法重新连接到它?