mongo aggregate聚合出现没有配置游标问题:The 'cursor' option is required

有时一个月的时间没有写博客了,是最近比较忙,也是自己在学习的阶段,所以花在博客的时间就相对比较少了;最近一个月都是在学mongo的相关内容,包括mongo的map-reduce,聚合管道以及mongo的索引等技术点;今天写的文章内容就是我在学习聚合管道遇到的问题;

mongo聚合的java实现,mongo API提供两种的实现方式:

          1.基于mongotemplate提供的聚合接口:aggregate(arg1,arg2....)等不同参数的方法,读者可以按需调用;特点是该API封装了mongo底层的聚合操作符,比如$match,$project等,暴露出来的对应为project()、match()等接口;所以这种方法更适合初学者使用;使用该接口不会出现我们标题说的那个错误;

          2.基于比较底层提供的DBCollection提供的aggregate接口(arg1,arg2....);该方法要求对mongo的nosql比较熟悉,因为该接口入参是DBObject,所以需要我们自己写mongo的聚合操作符:$match等操作符,所以要求比较高;和我们这里相关脸的问题是,该接口内部调用mongo底层的数据默认的输出格式是INLINE,所以会出现我们标题的那个错误;后面会分析;

Java端实现聚合的时候,通过上面第二种实现方式的时候,出现了标题的那个错误:The 'cursor' option is required, except for aggregate with the explain argument,刚开始遇到这个问题的时候,去查找网上的资料,发现网上国内的资料非常的少,而且内容也大都相似,都是说修改spring-data-mongo的jar包版本,或者修改mongo的驱动版本:mongo-java-dirver版本,但是我都尝试过了,还是解决不了我的问题;但是有查到用的信息是说这个错误是mongo服务升级到3.5以上之后,要求的聚合的时候要配置cursor的,顺着这可能的原因,我就尝试着跟踪源码,看能不能解决我的问题,  终于,最后在源码出找到了解决办法;经过最终的排错,确定是我的mongo server服务已经为3.6.3了;如果你的mongo服务还是3.5以下,或许就不会出现这个问题了,所以先确认你的mongo服务是不是3.5以上的;然后最终解决的办法是调用DBCollection的聚合接口中有包含有聚合配置的参数:AggregationOptions的接口,然后配置AggregationOptions的outputModel为CURSOR就可以解决这个问题了;代码如下:

List<DBObject> pipeline = new ArrayList<>(); 
pipeline.add(xxx)//聚合条件省略,笔者自己添加聚合条件
AggregationOptions build = AggregationOptions.builder()
                .outputMode(AggregationOptions.OutputMode.CURSOR)//指定聚合的输出格式为CURSOR
                .build();
        Cursor aggregate = orderDao.getMt().getCollection(Order.class.getSimpleName().toLowerCase()).aggregate(pipeline, build);

源码分析如下:

步骤1:最开始我调用的接口是只有一个参数的接口:

步骤2,紧跟着下一步:

步骤3,下一步,查看commang的生成源码:

从步骤3就可以看出我们这个问题根源了:mongo服务3.5以上要求聚合的时候要配置游标大小,就是每次获取的数据大小;而如果调用步骤1所示的只有聚合管道参数的接口的话,那么在步骤2的就已经内部写死了outputMode为INLINE,所以如果mongo服务已经升级到3.5之后的话,就不能调用步骤一的接口;所以就是查找是否有提供可以配置AggregationOptions的接口;所以,查找后有相关的接口如下:

所以最终的解决办法就是文章开头提到的,配置options的outputMode为CURSOR即可解决问题;

返回的数据接口是Cursor对象,该对象是Iterator的子类,所以获取的方法就是通过迭代器获取;

因为发现国内这个问题相关的文章还是寥寥无几,所以特意花时间写下这篇文章和读者分享,希望这篇文章可以解决读者遇到的问题;

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值