当我在mongodb中处理5,000,000条以上的记录时,它会在"Read timed out after reading 0 bytes, waited for 30.000000 seconds"
查询中显示此错误find()
。请任何人帮助我。
答案 0 :(得分:9)
在PHP中,您可以将timeout(-1)
设置为光标。
PHP示例:
$conn = new MongoClient("mongodb://primary:27017,secondary:27017", array("replicaSet" => "myReplSetName"));
$db = $conn->selectDB(DBname);
$collection = $db->selectCollection(collection);
$cursor = $collection->find();
$cursor->timeout(-1);
Node.js示例:
// Database connect options
var options = { replset: { socketOptions: { connectTimeoutMS : conf.dbTimeout }}};
// Establish Database connection
var conn = mongoose.connect(conf.dbURL, options);
答案 1 :(得分:4)
在PHP中,您可以将参数socketTimeoutMS添加到连接字符串的其他参数,在本例中为90秒。
$conn = new MongoClient("mongodb://primary:27017,secondary:27017", array("socketTimeoutMS" => "90000"));
问候!
答案 2 :(得分:2)
查看mongodb日志文件并在其中查找您的查询 - 执行需要多长时间?如果确实需要很长时间,您是否添加了索引?它们被使用了吗?从mongodb日志文件中剪切/粘贴查询并从mongo shell中尝试 - 并添加" .explain()"在末尾。它会告诉你MongoDB正在执行的执行计划 - 也许你可以从那边攻击你的问题。如果您的查询确实需要超过30秒,那么无论如何,您都可能需要解决它 - 无论驱动程序超时问题如何。
答案 3 :(得分:1)
ensureIndex键并尝试
MongoCursor::$timeout = 600000;
答案 4 :(得分:0)
我在使用php驱动程序删除1-2kk日志记录时发现了这个问题。 基本上我不得不添加超时(我使用索引,只是db有点大)
$dtObject = new DateTime();
$dtObject->modify("- " . $interval);
$date = new MongoDate($dtObject->format("U"));
$filter = array('dtCreated' => array('$lt' => $date));
$num = $this->collection->count($filter);
if ($num > 0)
$this->collection->remove($filter)->timeout(-1);
return $num;
这对我有用