在同一集合上更新时,mongo 光标会受到影响


Will mongo cursor affected while update on the same collection?

>我有一些代码,如下所示,

$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?

如果我

理解正确,你会对为什么mongodb只更新一个文档感到困惑。

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

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

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

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

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