我正在尝试在我的集合(包含超过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
而不是集合运行命令。