我有一些代码如下,
$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?
答案 0 :(得分:0)
如果我正确理解你,你就会对为什么mongodb只更新一个文件感到困惑。
Mongodb一次只更新一个文档。要更新与您的查询匹配的所有文档,请通过multiple
将'multiple' => true
选项传递给mongodb。见https://stackoverflow.com/a/15691466/2416049
答案 1 :(得分:0)
您的foreach只迭代500次,因为您的批量大小为500.您需要调用next()或getnext()来检索接下来的500个元素。
答案 2 :(得分:0)
您尝试使用查询中的foreach循环内部更新,该查询中没有任何来自$ item的内容。因此,您的查询将始终针对同一文档(vid:“just_a_video_key_and_can_be_any_string”)而不是针对项目...您需要将foreach内部的查询设置为"vid" => $item->vid
之类的内容。
关于“只有500”的事情:LinJuuichi是对的 - 你需要通过next()触发光标以获得下一批500.