MongoDB查找游标vs toArray迭代和num请求

时间:2017-07-17 11:41:23

标签: php mongodb python-requests

我在php上使用MongoDB。 当我执行查找时,将返回MongoDB \ Driver \ Cursor。

迭代检索数据的更好方法是什么?

foreach($cursor as $entry){}

foreach($cursor->toArray() as $entry){}

每种方法都会向服务器发送多少个请求? 如果有多个,有没有办法通过一个请求检索所有数据?

提前致谢。

1 个答案:

答案 0 :(得分:2)

一旦开始迭代光标,MongoDB就会批量返回文档(默认批量大小为101)。在第一次迭代时,调用命中服务器以获取第一批文档,驱动程序在本地存储这些文档。在后续迭代中,驱动程序从本地提供文档,直到迭代达到批处理大小。因此,在第102次迭代驱动程序上再次向服务器发送调用以获取下一批,依此类推。

您可以通过batchSize方法提供可选参数find来设置批量大小,可以找到更多帮助here

接近1:

foreach($cursor as $entry){}

接近2:

foreach($cursor->toArray() as $entry){}

$cursor->toArray以这样的方式实现,它迭代光标并将其返回到数组中。因此,当您使用这些方法中的任何一种时,对服务器进行的调用次数相同。唯一的区别是您将使用方法2 获得单个结果集数组。

使用方法2的缺点

  • 结果集迭代两次,一次是toArray方法,一次是从数组中输入。
  • 如果结果集中包含大量文档,则可能会出现内存问题(内存不足)。

回答您的问题

方法1 最好实现,如果你想在游标迭代期间最小化对服务器的调用次数,只需显式设置batchSize(通过提供可选参数batchSizefind方法中)。