mongodb聚合查询异常与jar包冲突解决方案
想了很久,个人 觉得这个mongo查询bug和日常jar包的冲突,大家开发中一定会我一样常见,今天就这个问题写一篇自救的解决步骤,希望开发的路上能很快跳过这个坑!
Error [The ‘cursor’ option is required, except for aggregate with the explain argument]异常
2019-11-13 19:43:49,606 INFO ys.bigdata.operation.utils.PagerUtils.queryPager(PagerUtils.java:197) - LIMIT: 21 ,INFO QUERY :Query: { "SRC_USERCODE" : "pinganyinhang02"}, Fields: { }, Sort: { "TRANDATE" : -1 , "TRADESN" : -1}
2019-11-13 19:43:49,606 INFO ys.bigdata.operation.service.paybill.impl.PayBillServiceImpl.queryPayBill(PayBillServiceImpl.java:830) - ****************** paybill 查询集群
2019-11-13 19:43:49,715 INFO ys.bigdata.operation.service.paybill.impl.PayBillServiceImpl.queryPayBill(PayBillServiceImpl.java:906) - PAYBILL 查询条件:Query: { "SRC_USERCODE" : "pinganyinhang02"}, Fields: { }, Sort: { "TRANDATE" : -1 , "TRADESN" : -1}
2019-11-13 19:43:49,735 INFO ys.bigdata.operation.service.paybill.impl.PayBillServiceImpl.payBillSum(PayBillServiceImpl.java:143) - AMOUNT QUERY Query: { "SRC_USERCODE" : "pinganyinhang02"}, Fields: null, Sort: null
2019-11-13 19:43:49,780 WARN org.springframework.data.mongodb.core.MongoTemplate.logCommandExecutionError(MongoTemplate.java:404) - Command execution of { "aggregate" : "PAYBILL" , "pipeline" : [ { "$match" : { "SRC_USERCODE" : "pinganyinhang02"}} , { "$group" : { "_id" : null , "amount" : { "$sum" : "$ORDERAMOUNT"} , "total" : { "$sum" : "$SRC_FEE"} , "payeeAmount" : { "$sum" : "$PAYEE_FEE"} , "payerAmount" : { "$sum" : "$PAYER_FEE"}}}]} failed: The 'cursor' option is required, except for aggregate with the explain argument
2019-11-13 19:43:49,782 ERROR ys.bigdata.operation.service.paybill.impl.PayBillServiceImpl.queryPayBill(PayBillServiceImpl.java:120) - 查询异常:org.springframework.dao.InvalidDataAccessApiUsageException: Command execution failed: Error [The 'cursor' option is required, except for aggregate with the explain argument], Command = { "aggregate" : "PAYBILL" , "pipeline" : [ { "$match" : { "SRC_USERCODE" : "pinganyinhang02"}} , { "$group" : { "_id" : null , "amount" : { "$sum" : "$ORDERAMOUNT"} , "total" : { "$sum" : "$SRC_FEE"} , "payeeAmount" : { "$sum" : "$PAYEE_FEE"} , "payerAmount" : { "$sum" : "$PAYER_FEE"}}}]}; nested exception is com.mongodb.MongoCommandException: Command failed with error 9: 'The 'cursor' option is required, except for aggregate with the explain argument' on server 10.213.32.84:50000. The full response is { "ok" : 0.0, "errmsg" : "The 'cursor' option is required, except for aggregate with the explain argument", "code" : 9, "codeName" : "FailedToParse", "operationTime" : { "$timestamp" : { "t" : 1573645422, "i" : 1 } }, "$clusterTime" : { "clusterTime" : { "$timestamp" : { "t" : 1573645422, "i" : 1 } }, "signature" : { "hash" : { "$binary" : "9RJgerlBdgPW90c3bp3uI7/Nn44=", "$type" : "00" }, "keyId" : { "$numberLong" : "6747508413606920194" } } } }
从异常字面意思,Cousor必有值或aggregate对象有值,显然我们的真正错误不是这个原因!
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191114105803782.png)
用万能的百度或必应搜索发现,这个跟代码层面没有关系,是mongodb版本的
参考:[添加链接描述](https://blog.csdn.net/a1491918446/article/details/79468168)
为些我们升级 org.springframework.data 由
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.9.5.RELEASE</version>
</dependency>`
升级为:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<!--<version>1.9.5.RELEASE</version>-->
<version>1.10.15.RELEASE</version>
</dependency>
再启动项目,用测试demo一调用:
发现报另外一错误,方法类AnnotationUtils找不到
在项目中查找这个类,发现存在多个版本的,想到jar包冲突,引志找不到类的问题:
再细看这个类的jar包,去掉3.2.5的版本依赖
找到引入这个jar包的pom依赖,去掉paylib.springframework里所有jar包
<!-- hikefa core -->
<dependency>
<groupId>paylib.hikefa</groupId>
<artifactId>base</artifactId>
<version>3.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<artifactId>*</artifactId>
<groupId>paylib.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
重新编译,发现3.2.5的springframework不见了
重启项目,调用测试demo:
程序调用正常,至此问题得到解决!
bug解决之后,这样一写半小时解决,其实际排查远超这个时间,所以分享一下,让大家下次遇到类似的问题,可以快速解决!