MongoDB 3.6.2聚合查询转BSONDocument报错:需指定cursor选项
解决MongoDB 3.6.2中使用BSONDocument执行聚合查询时的cursor选项错误
这个问题是MongoDB版本升级带来的规则变化导致的:从3.6版本开始,除了带explain参数的聚合操作外,所有聚合命令都必须显式指定cursor选项,而3.2.7版本没有这个强制要求。
你在命令行和Robomongo里能正常运行查询,是因为这些工具会自动帮你补充默认的cursor配置;但你手动构造BSONDocument的时候,完全按照旧版本的写法来,漏掉了这个必填项,所以才会触发这个报错。
只需要在你的commandDoc里添加一行"cursor" -> BSONDocument()就可以解决问题,修改后的完整代码如下:
val commandDoc = BSONDocument( "aggregate" -> "portfolio", // 聚合操作的目标集合 "pipeline" -> BSONArray( BSONDocument("$match" -> BSONDocument("id" -> portfolioId)), BSONDocument( "$project" -> BSONDocument( "medias" -> BSONDocument( "$filter" -> BSONDocument( "input" -> "$medias", "as" -> "category", "cond" -> BSONDocument( "$eq" -> Json.arr("$$category.categoryId", categoryId) ) ) ) ) ) ), "cursor" -> BSONDocument() // 添加默认游标配置,满足3.6+的强制要求 )
如果你需要自定义游标的行为(比如指定每次批量返回的文档数量),也可以给cursor设置具体参数,比如:
"cursor" -> BSONDocument("batchSize" -> 100)
这样修改后,你的聚合查询就能在MongoDB 3.6.2版本正常运行了。
内容的提问来源于stack exchange,提问作者Manoj S Ramaswamy
相关产品推荐
相关产品推荐

