ReactiveMongo类型与排序方法不匹配

问题描述 投票:0回答:1

我正在编写供不同类使用的通用查找方法。

def _find[T](selector: Option[BSONDocument], sorter: Option[BSONDocument], projection: Option[BSONDocument])
  (implicit reader: BSONDocumentReader[T], collectionName: String): Future[List[T]] = {
  val _sorter: reactivemongo.bson.BSONDocument = sorter.getOrElse(reactivemongo.bson.BSONDocument())
  for {
    collection <- database.map(_.collection(collectionName))
    r <- collection.find(selector.getOrElse(BSONDocument()))
      // .sort(sorter.getOrElse(reactivemongo.bson.BSONDocument()))  // this does not compile
      .sort(_sorter)
      .projection(projection.getOrElse(BSONDocument()))
      .cursor[T]().collect[List](Int.MaxValue, Cursor.FailOnError[List[T]]())
  } yield (r)
}

选择器,排序器和投影都是可选的,但是如果我将getOrElse作为参数的一部分,并且必须在find()方法之外“获取”排序器值,则sort()方法将失败。我现在正在使用ReactiveMongo 0.19.2和Scala 2.12,并且上面的代码确实与ReactiveMongo 0.16.0和Scala 2.11一起编译。编译错误如下。

> [error] ......: type mismatch; [error]  found   : Object [error] 
> required: reactivemongo.api.bson.BSONDocument [error]          
>           .sort(sorter.getOrElse(reactivemongo.bson.BSONDocument())) [error]    
>                                 ^
scala reactivemongo
1个回答
0
投票

以下内容未使用不推荐使用的BSON API进行编译。

import scala.concurrent._

import reactivemongo.api._
import reactivemongo.api.bson._ // !!

implicit def ec: ExecutionContext = ???
def database: Future[DefaultDB] = ???

def _find[T](selector: Option[BSONDocument], sorter: Option[BSONDocument], projection: Option[BSONDocument])
  (implicit reader: BSONDocumentReader[T], collectionName: String): Future[List[T]] = {

 for {
    collection <- database.map(_.collection(collectionName))
    r <- collection.find(selector.getOrElse(BSONDocument()))
      .sort(sorter.getOrElse(BSONDocument.empty))  // DOES COMPILE
      .projection(projection.getOrElse(BSONDocument()))
      .cursor[T]().collect[List](Int.MaxValue, Cursor.FailOnError[List[T]]())
  } yield (r)
}

没有与原始代码相关的import,我只能猜测这是旧/新API的不良组合(请参阅documentation about compat)。

© www.soinside.com 2019 - 2024. All rights reserved.