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


search in mongodb problems (local/remote)

我在两个不同的环境中遇到了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);

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

mongo对象列表对于这两个服务器也是相同的。。。。连接1个

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

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

p.S.iptables向下。。。我可以访问数据库(已连接=>1)

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

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

为了进一步调试,我建议首先降低超时值,然后比较每个服务器的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"; }