Php 在同一集合上更新时是否会影响mongo游标?

Php 在同一集合上更新时是否会影响mongo游标?,php,mongodb,Php,Mongodb,我有如下代码: $query = array("vid"=>"just_a_video_key_and_can_be_any_string"); $set = array("$set" => array("attr" => "attr_value")); $cursor = $collection->find(); $cursor = $cursor->batchSize(500); foreach ($cursor as $item) { $collect

我有如下代码:

$query = array("vid"=>"just_a_video_key_and_can_be_any_string");
$set = array("$set" => array("attr" => "attr_value"));
$cursor = $collection->find();
$cursor = $cursor->batchSize(500);
foreach ($cursor as $item) {
    $collection->update($query, $set)
}
我发现循环次数是500次,而$collection有20000多个文档

更新操作仅更新一个文档,不涉及删除或插入


我的问题是为什么
foreach
循环只有500次(即批量大小的数量),而数据库中的文档总数超过20K?

如果我理解正确,您会对mongodb为什么只更新一个文档感到困惑


Mongodb一次只更新一个文档。要更新与查询匹配的所有文档,请通过
'multiple'=>true将
multiple
选项传递给mongodb。请参见

您的foreach只迭代500次,因为批处理大小为500。您需要调用next()或getnext()来检索接下来的500个元素


您尝试在foreach循环中使用一个查询进行更新,该查询中没有任何来自$item的内容。因此,您的查询将始终针对同一文档运行(请参阅:“just_a_video_key_和_can_be_any_string”),而不是针对项目。。。您需要将foreach内部的查询设置为类似于
“vid”=>$item->vid

关于“仅有500个”这件事:LinJuuichi是对的-您需要通过next()触发光标以获得下一批500个。

代码似乎不完整。什么是$query,什么是$set?如果没有这些变量,就不可能给你答案,因为我们不知道你在做什么样的更新(查询中是否有$item)?@Osterjour很抱歉代码不完整。我已经完成了。很抱歉代码不完整。我已经完成了。请看新编辑的问题。我不这么认为。首先,我使用
while($item=$cursor->getNext())
在光标上循环。结果是相同的。
MongoCursor::getNext()是MongoCursor::next()的别名。
foreach
与getNext相同。所以关键是为什么循环次数是500,换句话说,当光标尝试获取下一批时,它返回null,循环中断。如果我对update语句进行注释,循环时间将变为20K+。