在同一个集合上更新时mongo游标会受到影响吗?

时间:2015-01-05 03:34:26

标签: 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) {
    $collection->update($query, $set)
}

我发现循环时间是500,而$ collection有20K +文档。

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

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

3 个答案:

答案 0 :(得分:0)

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

Mongodb一次只更新一个文档。要更新与您的查询匹配的所有文档,请通过multiple'multiple' => true选项传递给mongodb。见https://stackoverflow.com/a/15691466/2416049

答案 1 :(得分:0)

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

http://php.net/manual/en/mongocursor.batchsize.php

http://php.net/manual/en/mongocursor.next.php

答案 2 :(得分:0)

您尝试使用查询中的foreach循环内部更新,该查询中没有任何来自$ item的内容。因此,您的查询将始终针对同一文档(vid:“just_a_video_key_and_can_be_any_string”)而不是针对项目...您需要将foreach内部的查询设置为"vid" => $item->vid之类的内容。 关于“只有500”的事情:LinJuuichi是对的 - 你需要通过next()触发光标以获得下一批500.