我在php上使用MongoDB。 当我进行查找时,会返回MongoDB\Driver\Cursor。
迭代检索到的数据的更好方法是什么?
foreach($cursor as $entry){}
或
foreach($cursor->toArray() as $entry){}
每种方法向服务器发送了多少个请求? 如果有多个,有没有办法用一个请求检索所有数据?
提前谢谢。
MongoDB 会在您开始迭代光标后立即批量返回文档(默认批大小为 101(。在第一次迭代时,调用命中服务器以获取第一批中的文档,驱动程序将这些文档存储在本地。在后续迭代中,驱动程序从本地提供文档,直到迭代达到批大小。因此,在第 102 次迭代中,驱动程序再次向服务器发送调用以获取下一批,依此类推。
您可以通过find
方法中提供可选参数batchSize
来设置批大小,可在此处找到更多帮助
方法1:
foreach($cursor as $entry){}
方法2:
foreach($cursor->toArray() as $entry){}
$cursor->toArray
以这样一种方式实现的,即它迭代游标并在数组中返回其结果。因此,当您使用这些方法中的任何一种时,对服务器的调用次数相同。唯一的区别是,您将使用方法 2获得单个结果集数组。
使用方法 2的缺点:
- 结果集迭代了两次,一次在方法中
toArray
一次,一次在从数组中获取条目时。 - 如果结果集中有大量文档,则可能会出现内存问题(内存不足(。
回答您的问题:
方法 1会更好实现,如果要在游标迭代期间最小化对服务器的调用次数,只需显式设置batchSize
(通过在方法中提供可选参数batchSize
find
(。