我用Play!2.5创建了一个简单的应用程序,其中表单中的数据被写入我使用ReactiveMongo 0.11的数据库。
目前我正在尝试获取索引页面以显示数据库中的所有条目。
我的代码:
def index = Action.async{
val cursor: Cursor[User] = collectionF.find(Json.obj()).cursor[User]
val futureUserList :Future[List[User]] = cursor.collect[List]()
val futureUserListJsonArray :Future[JsArray] = futureUserList.map{user =>
Json.arr(user)
}
futureUserListJsonArray.map{ user=>
Ok(user)
}
}
我收到以下编译错误:
value find不是scala.concurrent.Future的成员[reactivemongo.play.json.collection.JSONCollection ]
find 指的是第二行的 collectionF.find()。
这是我在并发方面导入的内容:
import scala.concurrent.Future
import play.api.libs.concurrent.Execution.Implicits.defaultContext
由于
答案 0 :(得分:0)
正如cchantep已在评论中指出,您试图在find
上呼叫Future
,而不是在ReactiveMongo的JSONCollection
上呼叫,您需要一种方法来访问{{1}相反。
但是,我想知道你最初是如何使用JSONCollection
的。这不仅仅是我无法想象这样做的可行理由,之后使用该构造也很麻烦。是的,您可以使用例如Future[JSONCollection]
map
可以访问JSONCollection
,但这意味着返回的Cursor
也是Future
(这会迫使您flatMap
进行任何操作使用Cursor
)。
val cursor: Future[Cursor[User]] = collectionF.map(_.find(...).cursor[User])
val users = cursor.flatMap(...)
查看ReactiveMongo播放插件的documentation,特别是在页面底部的示例中:
class Application @Inject() (val reactiveMongoApi: ReactiveMongoApi)
extends Controller with MongoController with ReactiveMongoComponents {
// no Future here:
def collection: JSONCollection = db.collection[JSONCollection]("users")
}