当前位置: 首页 > 知识库问答 >
问题:

Spring data mongob-需要“游标”选项

东郭和光
2023-03-14

我试图使用Spring数据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]

提前感谢!!

共有3个答案

糜单弓
2023-03-14

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

  • 将您的Spring Data MongoDB依赖项升级到1.10.10。发布
  • 将您的spring-boot-starter-data-mongob依赖项升级到1.5.10。发布
施誉
2023-03-14

我用的是:

<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>
翁宜年
2023-03-14

MongoDB在3.6中更改了聚合命令的工作方式。聚合现在需要一个光标。我们改编了Spring Data MongoDB 2.1,但没有改编以前的版本。

聚合必须通过集合的聚集(...)方法调用,而不是直接调用命令。这也是我们没有向后移植更改的原因。不再调用执行命令(...),我们不想在错误修复版本中破坏兼容性。

最简单的方法是重写aggregate(…)方法并调用适当的方法DBCollection。使用映射的聚合管道聚合(…)。

 类似资料:
  • 我试图写一个代码为每个股票价值是75美元或更多添加一个"*"在STK_FLAG列。 ORA-06550:第15行,第21列:PLS-00201:标识符“STK\U FLG”必须声明ORA-06550:第15行,第5列:PL/SQL:SQL语句忽略ORA-06550:第23行,第7列:PL/SQL:ORA-00904:“STK\U FLG”:无效标识符ORA-06550:第17行,第5列:PL/SQ

  • 问题内容: 我会明白为什么 需要新的线程;它适用于: 为什么我不能使用同一线程?一世: 将光标设置为WAIT(进入GUI队列) 做我的长任务…(它进入GUI队列,但我希望光标更改,即在队列中,它在此之前执行) 将光标重置为默认值(任务完成后) 那么,我的长任务不会进入MAIN队列吗?因为,如果它进入主队列,我希望它在我的WAIT游标首先插入队列之后执行。为什么会这样呢? 问题答案: 没有线程,您的

  • 问题内容: 我试图使用Spring Data MongoDB 3.6-rc4执行聚合操作。 但是在运行查询时出现以下错误 提前致谢!! 问题答案: MongoDB在3.6中更改了聚合命令的工作方式。聚合现在需要一个游标。我们改编了Spring Data MongoDB 2.1, 但没有改编以前的版本。 聚合必须通过集合的方法来调用,而不是直接调用命令。这也是我们没有回溯变更的原因。不再被调用,我们

  • 问题内容: 这很简单,我要做的就是为游戏保存高分(整数)。我假设最简单的方法是将其存储在文本文件中,但是我真的不知道如何进行此操作。 问题答案: 如果您只需要存储一个整数,则SharedPreferences最适合您使用: 获得首选项: 当然,用高分值的键和您的偏好的键替换(这些可以是任意的。将它们设置为可识别且独特的东西是很好的)。

  • 问题内容: 执行以下聚合管道: 引发以下异常: 我不明白这里的光标选项是什么意思。该选项应在哪里配置? 编辑 这是一个示例用户文档 问题答案: 从文档。 MongoDB 3.4不建议使用不带游标选项的聚合命令,除非管道包括解释选项。使用聚合命令以内联方式返回聚合结果时,请使用默认批处理大小游标:{}指定游标选项,或在游标选项游标:{batchSize:}中指定批处理大小。 你可以通过与在春季蒙戈2

  • 问题内容: 在回答这个问题时,谈到要调用时需要参数标签。这在Swift中很正常。 但是,陌生力量在起作用: 要在此处使用参数标签,必须明确声明。 在文档中,我还没有看到非常详尽的解释。哪些种类的类/实例/全局函数需要自变量标签?是否始终使用参数标签导出和导入Obj-C方法? 问题答案: 从Swift 3.0开始,这种情况再次发生了变化:除非您使用外部名称明确选择退出,否则所有方法,函数和初始化器都