ReactiveMongo 类型与排序方法不匹配
ReactiveMongo Type Mismatched with Sort Method
我正在编写一个通用的查找方法,供不同的 类 使用。
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 作为参数的一部分,则 sort() 方法会失败,我必须 "get" 在 find() 方法之外的排序器值。我现在使用的是 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]
> ^
以下不使用已弃用的 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
与原始代码相关,我只能猜测它是 old/new API 的糟糕组合(参见 documentation about compat)。
我正在编写一个通用的查找方法,供不同的 类 使用。
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 作为参数的一部分,则 sort() 方法会失败,我必须 "get" 在 find() 方法之外的排序器值。我现在使用的是 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]
> ^
以下不使用已弃用的 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
与原始代码相关,我只能猜测它是 old/new API 的糟糕组合(参见 documentation about compat)。