web-dev-qa-db-ja.com

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]

前もって感謝します!!

19
rohit

MongoDBは、3.6で集約コマンドの動作方法を変更しました。集約にはカーソルが必要になりました。私たち Spring Data MongoDB 2.1に適応 以前のバージョンではありません。

集計は、コマンドを直接呼び出すのではなく、コレクションのaggregate(…)メソッドを介して呼び出す必要があります。これは、変更をバックポートしなかった理由でもあります。 executeCommand(…)は呼び出されなくなり、バグ修正リリースで互換性を壊したくありません。

最も簡単なアプローチは、aggregate(…)メソッドをオーバーライドし、マップされた集約パイプラインで適切なメソッドDBCollection.aggregate(…)を呼び出すことです。

21
mp911de

私が使用していた:

<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>
5
Andrei Maimas

@ mp911deが言及したプルリクエストは、Spring Data MongoDBのバージョン1.10.10でリリースされたようです。だからあなたはどちらか

  • spring Data MongoDBの依存関係を1.10.10.RELEASEにアップグレードします
  • spring-boot-starter-data-mongodb依存関係を1.5.10.RELEASEにアップグレードします
2
Atari

集計クエリパイプラインで使用可能なカーソルオプションを使用できます。

{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)))が役立つ場合があります

1
mhvr
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>
1
amit kumar

Mongodbバージョン3.6.2を使用すると、このタイプのエラーに直面しました。

Pom.xmlのorg.springframework.dataのバージョンを確認してください

私にとっては、org.springframework.data versionを2.0.3.RELEASEに変更して、問題を解決しました。

1
Adarsh Patel

スプリングブートを「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>
0
Andrei Maimas

Org.springframework.dataバージョン1.10.3.RELEASEを使用するときに、このタイプのエラーに直面しました。そして、バージョンを2.0.5.RELEASEに変更し、問題が解決しました。

0
Giahu