我在php上使用MongoDB。 当我执行查找时,将返回MongoDB \ Driver \ Cursor。
迭代检索数据的更好方法是什么?
foreach($cursor as $entry){}
或
foreach($cursor->toArray() as $entry){}
每种方法都会向服务器发送多少个请求? 如果有多个,有没有办法通过一个请求检索所有数据?
提前致谢。
答案 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
(通过提供可选参数batchSize
在find
方法中)。