java - example - spring data mongodb mongotemplate
Spring data mongodb: se requiere la opciĆ³n ''cursor'' (8)
Estoy tratando de ejecutar una operación agregada usando Spring Data MongoDB 3.6-rc4.
Aggregation agg = newAggregation(
lookup("orders", "orderId", "_id", "order")
);
List<BasicDBObject> results = mongoOperations.aggregate(agg, "transactions", BasicDBObject.class).getMappedResults();
Pero obtenga el siguiente error al ejecutar la consulta
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]
¡¡Gracias por adelantado!!
Estaba usando:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath></relativePath>
</parent>
Luego, después de actualizar mi dependencia a una versión superior, el problema se resolvió:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.10.RELEASE</version>
<relativePath></relativePath>
</parent>
MongoDB cambió en 3.6 cómo funciona el comando de agregación. Las agregaciones requieren ahora un cursor. Adaptamos Spring Data MongoDB 2.1 pero no versiones anteriores.
Las agregaciones deben invocarse a través del método
aggregate(…)
la colección
aggregate(…)
lugar de llamar al comando directamente.
Esta es también la razón por la cual no respaldamos el cambio.
executeCommand(…)
ya no se llama y no queremos romper la compatibilidad en una versión de
executeCommand(…)
.
El enfoque más fácil para usted puede ser anular el método
aggregate(…)
y llamar al método apropiado,
DBCollection.aggregate(…)
con la canalización de agregación asignada.
Parece que la solicitud de extracción mencionada por @ mp911de se ha lanzado en la versión 1.10.10 de Spring Data MongoDB. Entonces puedes
- actualice su dependencia de Spring Data MongoDB a 1.10.10.
- actualice su dependencia spring-boot-starter-data-mongodb a 1.5.10.
Puede usar la opción de cursor disponible con la tubería de consulta agregada.
{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)))
puede ayudar en este caso
Se resolvió el problema actualizando el arranque de primavera a la versión ''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>
También me he enfrentado a este tipo de error al usar Mongodb versión 3.6.2.
Verifique su versión de org.springframework.data en pom.xml
Para mí, he cambiado la versión org.springframework.data a 2.0.3.RELEASE y mi problema se resolvió.
También me he enfrentado a este tipo de error al usar org.springframework.data versión 1.10.3.RELEASE. Y luego he cambiado la versión a 2.0.5.RELEASE y mi problema se resolvió.
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>