mongo aggregate在mongo 升到3.6之后报错The 'cursor' option is required, except for aggregate with the expl

场景

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'] : [];
    }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值