如何使用 ReactiveMongo 设置 Play!2.5

How to setup Play!2.5 with ReactiveMongo

我使用 Scala 连接到 MongoDB 使用:

val driver = new MongoDriver
val connection = driver.connection(List("myhost"))
val db = connection.database("mydb")

这很好用,但是如何将它与 Play 控制器集成:

@Singleton
class ReactiveController @Inject() (implicit system: ActorSystem, materializer: Materializer, val reactiveMongoApi: ReactiveMongoApi)
    extends Controller with MongoController with ReactiveMongoComponents {

我需要在我的数据库配置中注入自定义 ReactiveMongoApi 吗?

或者我需要用我的数据库设置修改 application.conf 吗?

我正在使用 play 2.5,http://reactivemongo.org/releases/0.11/documentation/tutorial/play2.html 提供了以下代码:

package api

import reactivemongo.api.{ DB, MongoConnection, MongoDriver }

trait ReactiveMongoApi {
  def driver: MongoDriver
  def connection: MongoConnection
  def db: DB
}

但我不确定如何将它与我的 Play 应用程序集成?

我想我不知道使用 Play 配置数据库源的一些标准方法!申请 ?

确保您在 application.conf

中的配置正确
play.modules.enabled += "play.modules.reactivemongo.ReactiveMongoModule"
mongodb.uri = "mongodb://localhost:27017/demodb"

您需要注入并更改 mongo 代码如下

class MongoUserDao @Inject() (val reactiveMongoApi: ReactiveMongoApi)
extends UserDao {
//  val users = reactiveMongoApi.db.collection[JSONCollection]("users") -- old API
//   def find(userId:UUID):Future[Option[User]] =
//    users.find(Json.obj("id" -> userId)).one[User]  -- old code

  def usersF = reactiveMongoApi.database.map(_.collection[JSONCollection]("users"))  //new API

  def find(userId:UUID):Future[Option[User]] = for {
    users <- usersF
    user <- users.find(Json.obj("id" -> userId)).one[User]
  } yield user     // new code
}

如果将新 api 代码与旧 api 代码进行比较,reactiveMongoApi.database.map returns Future[Collection].