使用PHP,MongoDB聚合不起作用(或非常慢)并且在shell中完美运行?

时间:2013-01-28 00:21:13

标签: php mongodb aggregation-framework

我正在尝试在我的集合中使用聚合方法(包含超过20M的文档)。

我首先在Windows shell中尝试过它:

db.data.aggregate([
{$match: {firstname: "Roger"}},
{$group:{"_id":"$id_car",count:{$sum: 1}}},
{$sort: {count: -1}},
{$limit: 50}])

它完美无缺,几秒后返回结果。

当我在PHP中“翻译”它时:

$data = $db->data;
$ops = array(
    array(
         '$match' => array(
             'firstname' => 'Roger'
         )
    ),
    array(
        '$group' => array(
            '_id' => '$id_car',
            'count' => array(
                '$sum' => 1     
            )       
        )
    ),
    array(
        '$sort' => array(
            'count' => -1
        )
    ),
    array(
        '$limit' => 4       
    )
);
$res = $data->aggregate($ops);

我得到超时PHP致命错误:

Uncaught exception 'MongoCursorTimeoutException' with message 'localhost:27017: cursor timed out (timeout: 30000, time left: 30:0, status: 0)'

我不知道我的PHP代码是否犯了错误,或者假设聚合在PHP中比在shell中慢得多?

此外,我在“firstname”字段中添加了一个索引,以使查询更快。

顺便说一句,有没有办法将超时设置为无限远?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

我真的不知道你的问题(PHP比MongoShell慢),但我做过的事情让我在PHP中运行聚合(由于超时问题)正在改变我调用的方式聚合

希望这可以帮助到达此页面的人因为超时问题,就像我做的那样!

而不是$data->aggregate($ops)我运行了以下等同于您的案例:

$db->command(
    array('aggregate' => 'data', 'pipeline' => $ops),
    array('timeout' => 100000000)
)

请注意,您必须通过$db而不是您的收藏集运行命令。