MongoDB聚合在PHP上不起作用(或者非常慢),并且在shell中可以完美地工作


MongoDB aggregation does not work (or is very slow) with PHP and works perfectly in shell?

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

我首先在Windows外壳中尝试了它:

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 中慢得多?

此外,我还在"名字"字段上添加了一个索引,以使查询速度更快。

顺便问一下,有没有办法将这种调用的超时设置为无穷大?

非常感谢您的帮助!

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

希望这可以帮助像我一样因超时问题而访问此页面的人!

我没有$data->aggregate($ops)而是运行了以下与您的案例等效的操作:

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

请注意,必须对$db而不是集合运行命令。