搜索mongodb问题(本地/远程)

时间:2013-08-01 22:12:59

标签: php mongodb

我在两个不同的环境中遇到mongodb数据库和php脚本的问题。

第一个环境在localhost上有x86 mongodb版本。 第二个环境在远程服务器上有x64 mongodb版本。

php脚本是一样的(它在x86 mongodb机器上)。

    $mongo = new Mongo("mongodb://IP:27017");
    pr($mongo);
    $db_mongo = $mongo->my_database;
    $collection = $db_mongo->my_collection;
    $where  = array('$and'=> array(array("NAME" => new MongoRegex("/.*{$name}.*/i")), array("STATUS" => 0)));
    $object_results = $collection->find($where)->timeout(100000);

对于localhost,IP为127.0.0.1,对于远程服务器,为188 ....在两个mongodb数据库上都是具有相同数据的相同集合(导入/导出)。

对于两台服务器来说,mongo对象也是一样的....连接1

Mongo Object
(
    [connected] => 1
    [status] => 
    [server:protected] => 
    [persistent:protected] => 
)

我不明白为什么在本地连接上会返回一些结果,但在远程服务器上它不会返回记录......

P.S。 iptables down ...我可以访问数据库(connected => 1)

1 个答案:

答案 0 :(得分:0)

首先,如果您使用的是1.3或更高版本的驱动程序版本,我建议使用MongoClient类代替Mongo(因为已弃用)。

由于您使用MongoCursor::timeout()指定了100,000毫秒,因此脚本的挂起时间不应超过100秒,因为如果在此时间内没有收到服务器的响应,则驱动程序应抛出MongoCursorTimeoutException。 p>

为了进一步调试,我建议先降低超时值,然后比较每个服务器的MongoCursor::explain()输出。解释输出应该清楚一个服务器是否没有为其查询使用索引,正如Sammaye在上面假设的那样。

此外,添加以下内容将允许您收集驱动程序内部活动的日志:

MongoLog::setModule(MongoLog::ALL);
MongoLog::setLevel(MongoLog::ALL);
MongoLog::setCallback('print_mongo_log');
function print_mongo_log($a, $b, $c) { echo $c, "\n"; }