mongodb 没有 ->remove()->limit() 。这就是我使用我的小脚本来解决任务的原因。
<?php
$conn = new Mongo('127.0.0.1');
$db = $conn->experimentDB;
$experimentCollection = $db->experimentCollection;
foreach($ruleset AS $ruleset_item)
{
$max_remove_loops=3;
$max_limit_per_loop=1000;
MongoCursor::$timeout = 1*60*1000;
for($remove_loops=0;$remove_loops<$max_remove_loops;$remove_loops++)
{
if(!TEST)
$cursor = $experimentCollection->find($ruleset_item)->limit($max_limit_per_loop);//->skip($remove_loops*$max_limit_per_loop);
else
$cursor = $experimentCollection->find($ruleset_item)->limit($max_limit_per_loop)->skip($remove_loops*$max_limit_per_loop);
$items=0;
foreach($cursor AS $cursor_item)
{
//print_r($cursor_item['_id']);
print('.');
if(!TEST)
$experimentCollection->remove(array('_id' => $cursor_item['_id']));
$items++;
}
if($items==0)
{
break;
print(' that was the last one. DONE ');
}
//$cursor->reset();
}
}
?>
这最终在
致命错误:未捕获的异常“MongoCursorTimeoutException”,消息“光标超时(超时:60000,剩余时间:0:0,状态:0)”
这就是为什么我尝试使用 max_remove_loops 和 max_limit_per_loop 拆分任务并将 max_limit_per_loop 更改为 1min、1h、2h 等。
但是,似乎还有另一个问题,为什么脚本在数百次删除后挂起。有时在200-2000之间。(按 print('.') 计算)
这看起来像一个随机错误,取决于 mongodb 必须管理的其他任务、RAM、CPU 负载。
只是一个猜测,但如果循环正在捕获已在队列中等待被删除的相同游标,那么它可能会因为删除而引起麻烦?
如何将此脚本修复为容错并继续而不是挂起?