Php 聚合函数的MongoCorSortimeoutException
我试图使用聚合函数从Mongo集合中获取一些数据,但它给了我MongoCorSortimeoutException。我试图一次只选择50张唱片,而这个收藏有1700多万张唱片。这是从PHP完成的,我的代码如下:Php 聚合函数的MongoCorSortimeoutException,php,mongodb,Php,Mongodb,我试图使用聚合函数从Mongo集合中获取一些数据,但它给了我MongoCorSortimeoutException。我试图一次只选择50张唱片,而这个收藏有1700多万张唱片。这是从PHP完成的,我的代码如下: $data = $my_collection->aggregate(array( array('$match'=>$filter_query),
$data = $my_collection->aggregate(array(
array('$match'=>$filter_query),
array('$group'=>array('_id'=>'$email')),
array('$skip'=>$offset),
array('$limit'=>$per_page)
));
$filter_查询是另一个数组,它包含timestmap,如下所示
Array
(
[timestamp] => Array
(
[$gt] => 1383890400
[$lt] => 1384495200
)
)
我不知道为什么会发生这种情况,因为我试图只获取50条记录。我认为这是在选择了所有记录之后执行的,这是导致错误的原因。除了侵略,还有什么更好的方法吗
我可以将超时设置为-1,但这是否是一个好选项,因为驱动程序将永远等待以获得初始响应?要为聚合函数设置超时选项,应使用MongoDB对象实例的
命令函数。例如:
$result = $database->command(
array(
'aggregate' => $my_collection,
'pipeline' => array(
array('$match' => $filter_query),
array('$group' => array('_id'=>'$email')),
array('$skip'=>$offset),
array('$limit'=>$per_page)
)
),
array( 'timeout' => $timeout )
);
有关更多信息,请参阅为聚合函数设置超时选项,您应该使用MongoDB对象实例的命令
函数。例如:
$result = $database->command(
array(
'aggregate' => $my_collection,
'pipeline' => array(
array('$match' => $filter_query),
array('$group' => array('_id'=>'$email')),
array('$skip'=>$offset),
array('$limit'=>$per_page)
)
),
array( 'timeout' => $timeout )
);
有关更多信息,请参阅作为优化的一部分,您可以1)首先只选择15封电子邮件;2) 然后选择所选电子邮件中引用的记录;3) 应用所有其他规则。这样,您将显著减少要聚合的记录数。如果您可以使用缓存或预先计算的结果来执行如此昂贵的操作,那也太好了。顺便说一下,它为我返回了一个错误[errmsg]=>异常:字段(聚合)3的类型错误!=2您可以参考1.5.0版驱动程序的on stackoverflowAs。看起来您可以传入一系列选项,在这些选项中可以使用maxTimeMS参数定义超时。例如:$data=$my_collection->aggregate($pipeline,['maxtimes'=>120000]);请参阅超时
选项已弃用。它必须是['socketTimeoutMS'=>$timeout]
。作为优化的一部分,您可以1)首先只选择15封电子邮件;2) 然后选择所选电子邮件中引用的记录;3) 应用所有其他规则。这样,您将显著减少要聚合的记录数。如果您可以使用缓存或预先计算的结果来执行如此昂贵的操作,那也太好了。顺便说一下,它为我返回了一个错误[errmsg]=>异常:字段(聚合)3的类型错误!=2您可以参考1.5.0版驱动程序的on stackoverflowAs。看起来您可以传入一系列选项,在这些选项中可以使用maxTimeMS参数定义超时。例如:$data=$my_collection->aggregate($pipeline,['maxtimes'=>120000]);请参阅超时
选项已弃用。它必须是['socketTimeoutMS'=>$timeout]
。