在以下PHP脚本iterator_to_array
效率极低(我使用的是探查器)。以下代码有更好的选择吗?
$new = [];
$rows=(new Mongo())->table1->find(['foo' => 'bar'),
$new['string'] = iterator_to_array($rows); //Time-consuming part
(new Mongo())->table2->save($new);
答案 0 :(得分:1)
第一个查询实际返回了多少行?据推测,总数据小于16MB,因为您将其存储在新文档的一个字段中。
您的分析是否表明延迟是在网络IO中还是构建阵列?游标迭代实际上需要两者兼而有之。如果您在服务器端看到大量getmore
操作,则可以使用MongoCursor::batchSize()进行调整以减少网络往返。这将控制驱动程序在迭代期间一次请求的文档数。默认情况下,驱动程序将使用批量大小为101,因此如果您的结果由大量小文档组成,您可能会发现许多往返带有很小的有效负载。根据{{1}}返回的实际文档数量将限制为4MB或批量大小,以较小者为准。
除了增加批量大小外,如果您只关注某些字段,则可能需要向getmore
添加投影。
或者,如果这是一个很少使用的查询并且您想要避开网络IO,您可能需要考虑使用eval command(和{{1})在服务器端执行整个操作} 选项)。在选择走这条路线之前,请注意警告(记录在页面底部附近)。
答案 1 :(得分:0)
我认为没有其他选择,如果你有一个迭代器而你想要一个数组,你需要迭代迭代器并将值传递给数组,你可以自己使用foreach
来做,或者你可以使用iterator_to_array
,但如果迭代器中有许多元素,则该过程非常耗时。