场景
mongo库做了分片, 并且数据库从3.2升级到了3.6
代码爆了bug
解析
追踪bug发现是使用aggregate时 在mongo >3.5版本的时候 强至需要cursor
选项 `当然也可以使用explain选项,这样的得到的是本次查询的一些查询信息 类似于sql语句, 没什么用`
解决
cursor 指定分次查询的每次的查询的大小
两种方式
1. 默认批次大小 cursor是个空对象 [ 'cursor' => (object)[]]
2. 执行批次大小 ['cursor' => (object)['batchSize' => 10000]]
鉴于我们项目组的客户规模, 我才用了第二种解决方案, 一个批次可以解决问题。
当然还是需要对结果进行处理 下面贴上自己的代码
代码
public function accessCount($where, $group_type = null)
{
$group_type = $group_type ? '$uid' : null;
$pipeline = [
['$match' => $where],
['$group' => [
'_id' => $group_type,
'access_counts' => [
'$sum' => '$access_counts'
],
'success_counts' => [
'$sum' => '$success_counts'
],
]],
];
$stat_data = $this
->getCollection()
->aggregate($pipeline, ['cursor' => (object)['batchSize' => 10000]]);
return $stat_data['cursor']['firstBatch'] ? $stat_data['cursor']['firstBatch'] : [];
}