我正在尝试在我的集合中使用聚合方法(包含超过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”字段中添加了一个索引,以使查询更快。
顺便说一句,有没有办法将超时设置为无限远?
非常感谢你的帮助!
乔
答案 0 :(得分:1)
我真的不知道你的问题(PHP比MongoShell慢),但我做过的事情让我在PHP中运行聚合(由于超时问题)正在改变我调用的方式聚合
希望这可以帮助到达此页面的人因为超时问题,就像我做的那样!
而不是$data->aggregate($ops)
我运行了以下等同于您的案例:
$db->command(
array('aggregate' => 'data', 'pipeline' => $ops),
array('timeout' => 100000000)
)
请注意,您必须通过$db
而不是您的收藏集运行命令。