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

Kla*_*aus 1 php mongodb python-requests

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

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

foreach($cursor as $entry){}
Run Code Online (Sandbox Code Playgroud)

或者

foreach($cursor->toArray() as $entry){}
Run Code Online (Sandbox Code Playgroud)

每种方法向服务器发送了多少个请求?如果不止一个,是否有一种方法可以通过一个请求检索所有数据?

提前致谢。

Dil*_*mar 5

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

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

方法一:

foreach($cursor as $entry){}
Run Code Online (Sandbox Code Playgroud)

方法2:

foreach($cursor->toArray() as $entry){}
Run Code Online (Sandbox Code Playgroud)

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

使用方法 2的缺点:

  • 结果集迭代了两次,一次在toArray方法中,一次在从数组获取条目时。
  • 如果结果集中有大量文档,您可能会遇到内存问题(内存不足)。

回答你的问题

如果您想在游标迭代期间最大程度地减少对服务器的调用次数,只需显式设置(通过在方法中batchSize提供可选参数),方法 1会更好地实现。batchSizefind