web-dev-qa-db-fra.com

Spring data mongodb - L'option 'curseur' est requise

J'essaie d'exécuter une opération d'agrégation à l'aide de Spring Data MongoDB 3.6-rc4. 

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

Mais obtenir l'erreur suivante lors de l'exécution de la requête

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]

Merci d'avance!!

18
rohit

MongoDB a modifié en 3.6 le fonctionnement de la commande d'agrégation. Les agrégations nécessitent maintenant un curseur. Nous avons adapté Spring Data MongoDB 2.1 mais pas les versions précédentes. 

Les agrégations doivent être appelées via la méthode aggregate(…) de la collection au lieu d'appeler directement la commande. C'est aussi la raison pour laquelle nous n'avons pas annoté le changement. executeCommand(…) n'est plus appelé et nous ne voulons pas interrompre la compatibilité dans une version corrigée.

L'approche la plus simple peut être de remplacer la méthode aggregate(…) et d'appeler la méthode appropriée, DBCollection.aggregate(…), avec le pipeline d'agrégation mappé.

16
mp911de

J'utilisais:

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

Puis, après la mise à niveau de ma dépendance vers une version supérieure, le problème a été résolu:

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

Il semble que la requête Pull mentionnée par @ mp911de soit dans la version 1.10.10 de Spring Data MongoDB. Donc vous pouvez soit 

  • mettez à niveau votre dépendance Spring Data MongoDB vers 1.10.10.RELEASE
  • mettez à niveau votre dépendance spring-boot-starter-data-mongodb vers 1.5.10.RELEASE 
2
Atari
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

J'ai également rencontré ce type d'erreur avec Mongodb version 3.6.2. 

Vérifiez votre version deorg.springframework.datain pom.xml

Pour moi, j'ai changé org.springframework.data version en 2.0.3.RELEASE et mon problème a été résolu.

1
Adarsh Patel

Vous pouvez utiliser l'option de curseur disponible avec le pipeline de requêtes agrégées.

{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))) peut aider dans ce cas

0
mhvr

Résolution du problème en mettant à niveau Spring Boot vers la version '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

J'ai également été confronté à ce type d'erreur lors de l'utilisation de org.springframework.data version 1.10.3.RELEASE. Et puis j'ai changé de version à 2.0.5.RELEASE et mon problème a été résolu.

0
Giahu