Spring数据mongodb - '光标'选项是必需的

时间:2017-11-24 11:48:44

标签: java spring mongodb spring-data-mongodb

我正在尝试使用Spring Data MongoDB 3.6-rc4执行聚合操作。

Aggregation agg = newAggregation(
    lookup("orders", "orderId", "_id", "order") 
);
List<BasicDBObject> results = mongoOperations.aggregate(agg, "transactions", BasicDBObject.class).getMappedResults();

但是在运行查询时出现以下错误

2017-11-24 17:03:41,539 WARN  org.springframework.data.mongodb.core.MongoTemplate : Command execution of { "aggregate" : "transactions" , "pipeline" : [ { "$lookup" : { "from" : "orders" , "localField" : "orderId" , "foreignField" : "_id" , "as" : "order"}}]} failed: The 'cursor' option is required, except for aggregate with the explain argument
2017-11-24 17:03:41,574 ERROR org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Command execution failed:  Error [The 'cursor' option is required, except for aggregate with the explain argument], Command = { "aggregate" : "transactions" , "pipeline" : [ { "$lookup" : { "from" : "orders" , "localField" : "orderId" , "foreignField" : "_id" , "as" : "order"}}]}; 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 localhost:27017. The full response is { "ok" : 0.0, "errmsg" : "The 'cursor' option is required, except for aggregate with the explain argument", "code" : 9, "codeName" : "FailedToParse" }] with root cause
com.mongodb.MongoCommandException: Command failed with error 9: 'The 'cursor' option is required, except for aggregate with the explain argument' on server localhost:27017. The full response is { "ok" : 0.0, "errmsg" : "The 'cursor' option is required, except for aggregate with the explain argument", "code" : 9, "codeName" : "FailedToParse" }
    at com.mongodb.CommandResult.getException(CommandResult.java:80) ~[mongo-java-driver-3.5.0.jar:na]
    at com.mongodb.CommandResult.throwOnError(CommandResult.java:94) ~[mongo-java-driver-3.5.0.jar:na]
    at org.springframework.data.mongodb.core.MongoTemplate.handleCommandError(MongoTemplate.java:2100) ~[spring-data-mongodb-1.10.8.RELEASE.jar:na]
    at org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:1577) ~[spring-data-mongodb-1.10.8.RELEASE.jar:na]
    at org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:1505) ~[spring-data-mongodb-1.10.8.RELEASE.jar:na]

提前致谢!!

13 个答案:

答案 0 :(得分:21)

MongoDB在3.6中更改了聚合命令的工作原理。聚合现在需要一个游标。我们adapted Spring Data MongoDB 2.1但不是以前的版本。

必须通过集合aggregate(…)方法调用聚合,而不是直接调用命令。这也是我们没有向后退这一变化的原因。 executeCommand(…)已不再被调用,我们也不想破坏错误修正版本中的兼容性。

最简单的方法是覆盖aggregate(…)方法,并使用映射的聚合管道调用适当的方法DBCollection.aggregate(…)

答案 1 :(得分:5)

我正在使用:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.8.RELEASE</version>
    <relativePath></relativePath>
</parent>

然后在将我的依赖项升级到更高版本后,问题得以解决:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.10.RELEASE</version>
    <relativePath></relativePath>
</parent>

答案 2 :(得分:2)

似乎@ mp911de提到的Pull Request已经在Spring Data MongoDB的1.10.10版本中发布了。 所以你可以

  • 将Spring Data MongoDB依赖项升级到1.10.10.RELEASE
  • 将spring-boot-starter-data-mongodb依赖项升级为1.5.10.RELEASE

答案 3 :(得分:2)

升级spring boot版本对我不起作用。强制将输出模式更改为光标(提供光标)是可行的。在mongo 3.6中验证

nits_url

答案 4 :(得分:1)

使用Mongodb 3.6.2版时,我也遇到过这种错误。

在pom.xml中检查 org.springframework.data 的版本

对我来说,我已将 org.springframework.data 版本更改为2.0.3.RELEASE,我的问题已解决。

答案 5 :(得分:1)

Just updating the spring boot version works for me.
This is the version that I have used and worked....
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.10.RELEASE</version>
    </parent>

答案 6 :(得分:1)

您可以将光标选项用于聚合查询管道。

{cursor: { batchSize: batch_size }}

https://docs.mongodb.com/manual/reference/method/db.collection.aggregate/

Aggregation.newAggregation(AggregationOperation... operations).withOptions(new AggregationOptions(false,false,new Document().append("batchSize" , batch_size)))在这种情况下可能会有所帮助

答案 7 :(得分:0)

使用org.springframework.data版本1.10.3.RELEASE时,我也遇到过这种类型的错误。然后我将版本更改为2.0.5.RELEASE并解决了我的问题。

答案 8 :(得分:0)

通过将Spring Boot升级到“ 2.1.3.RELEASE”版本解决了该问题。

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <!--<version>1.5.10.RELEASE</version>-->
        <relativePath></relativePath>
    </parent>

答案 9 :(得分:0)

如果您遇到此问题,并且正在使用Studio 3T,则“选项”标签中有一个选项,只需对其进行检查即可:

enter image description here

答案 10 :(得分:0)

由于版本3.6中mongodb驱动程序的更改,您的命令不再起作用。 您需要改为通过dbCollection.aggregate(...)方法来调用它。

答案 11 :(得分:0)

我已经尝试了以上所有方法(缺少将代码更改为使用游标的方法)。

最后,我不得不怒气冲冲

'mongo-java-driver'       : '3.6.2'

然后它起作用了。

答案 12 :(得分:0)

  1. 使用Spring Boot 2.0.0或更高版本。
  2. 使用光标将AggregationOptions添加到您的Aggregation
AggregationOptions aggregationOptions = AggregationOptions.builder()
    .allowDiskUse(true)
    .cursor(new Document())
    .build();
Aggregation aggregation = Aggregation.newAggregation(aggregationOperations)
    .withOptions(aggregationOptions);
  1. 调用aggregateStream()的{​​{1}}(不是aggregate())方法。此方法利用了MongoDB响应的游标:
MongoOperations