PHP MongoDB驱动程序的游标如何缓冲结果集?

5
当查询mongodb时,它的游标如何处理内存中的结果集? 游标是一次检索所有匹配查询的文档吗?还是一次只检索一个文档?或者它们被缓冲了吗?或者有其他我不知道的解决方案?
如果是缓冲解决方案,它们如何在服务器/客户端上存储?客户端本地保留多少数据?

内存 - 是服务器的内存还是客户端的内存?游标永远不会检索文档,它只是一个游标。缓冲 - 再次在哪里?在客户端还是服务器上?还是你只对 PHP 客户端感兴趣? - hakre
两者都有可能。我想服务器必须在某个地方存储结果。也许我对游标的工作有些困惑,但游标确实充当了我的“网关”来获取数据,因此它必须从某个地方获取数据,并且那个地方必须存储它。我只是试图学习/弄清楚数据存储在哪里以及PHP客户端如何访问/缓冲它。 - Jim Rubenstein
游标允许客户端浏览服务器上可用的结果集。因此,如果您查询了500个文档,服务器只需要说:“这是游标”,客户端会说谢谢,然后使用游标在该集合中导航到某个位置。然后客户端说:“给我游标指向的文档”。服务器说:“好的,我知道那个游标,所以我可以给你文档。”至少这就是我理解游标的方式。游标本身不会获取数据,但用于客户端和服务器之间的通信。 - hakre
内部实现在这里:cursor.c - hakre
1个回答

5

MongoDB wire protocol 有关于查询时批处理大小的规定。

基本原则是客户端驱动程序使用 numberToReturn 标志发出查询。如果查询匹配超过 numberToReturn,则只返回该数量给客户端。

因此,服务器有效地向客户端发送一个“批次”。如果客户端循环遍历整个批次,则客户端发出 getmore 请求并接收下一批次。同时,服务器不需要将所有结果加载到内存中,只需满足客户端的请求即可。

PHP 驱动程序抽象了大部分这种复杂性。您只需要使用驱动程序请求下一个项,驱动程序将在适当的情况下处理 getmore

就大小而言,您将获得 Max BSON 大小或 numberToReturn 中较小的那个。因此,如果文档太大,您可能会达到 Max BSON 大小,以防止一次发送过多数据。

获取更多详细信息的最佳位置是实际代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接