1

我正在尝试对我的集合(包含超过 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 慢得多?

另外,我在“名字”字段上添加了一个索引,以使查询更快。

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

非常感谢你的帮助 !

4

1 回答 1

1

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

希望这可以帮助由于超时问题而到达此页面的人,就像我一样!

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

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

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

于 2013-11-13T18:12:01.920 回答