0

我正在使用 Reactive Mongo 0.11.11 版,我想在我的 DAO 中实现一个方法,该方法将所有文档按_id.

这是我的 DAO:

import com.google.inject.Inject
import models.auth.{Team, Player}
import play.api.libs.concurrent.Execution.Implicits.defaultContext
import play.api.libs.json._
import play.modules.reactivemongo.ReactiveMongoApi
import play.modules.reactivemongo.json._
import reactivemongo.bson._
import reactivemongo.play.json.collection.JSONCollection

import scala.concurrent.Future

trait TeamDao {
  def find(_id: BSONObjectID): Future[Option[Team]]

  def find(name: String): Future[Option[Team]]

  def save(team: Team): Future[Team]

  def link(player: Player, team: Team): Future[Team]

  def update(team: Team): Future[Team]

  def count(team: Option[Team] = None): Future[Int]

  def count(_id: BSONObjectID): Future[Int]

  def countAllPlayersWithTeam(team: Team): Future[Int]
}

class MongoTeamDao @Inject()(reactiveMongoApi: ReactiveMongoApi) extends TeamDao {

  val players = reactiveMongoApi.db.collection[JSONCollection]("players")
  val teams = reactiveMongoApi.db.collection[JSONCollection]("teams")

  def find(_id: BSONObjectID): Future[Option[Team]] = teams.find(BSONDocument("_id" -> _id)).one[Team]

  def find(name: String): Future[Option[Team]] = teams.find(Json.obj("name" -> name)).one[Team]

  def save(team: Team): Future[Team] = teams.insert(team).map(_ => team)

  def link(player: Player, team: Team) = for {
    _ <- players.update(Json.obj("_id" -> player.id), Json.obj("$push" -> BSONDocument("teams" -> team._id)))
    team <- find(team._id.get)
  } yield team.get


  def update(team: Team) = for {
    _ <- teams.update(BSONDocument("_id" -> team._id), BSONDocument("$set" -> BSONDocument("name" -> team.name)))
    team <- find(team._id.get)
  } yield team.get


  def count(team: Option[Team] = None): Future[Int] = {
    val tmpTeam: Team = team.getOrElse {
      return teams.count()
    }
    teams.count(Some(Json.obj("name" -> tmpTeam.name)))
  }

  def count(_id: BSONObjectID): Future[Int] = {
    teams.count(Some(Json.obj("_id" -> _id)))
  }

  def countAllPlayersWithTeam(team: Team): Future[Int] = {
    players.count(Some(Json.obj("teams" -> team._id)))
  }

}

问题是我收到以下错误:

value BSONObjectIDFormat in trait BSONFormats is deprecated: Use [[reactivemongo.play.json.BSONFormats.BSONObjectIDFormat]]
[error]     teams.count(Some(Json.obj("_id" -> _id)))

我试图用以下方法替换该count方法:

def count(_id: BSONObjectID): Future[Int] = {
 teams.count(Some(BSONDocument("_id" -> _id))) 
}

但后来我得到以下编译错误:

[error]  found   : reactivemongo.bson.BSONDocument
[error]  required: MongoTeamDao.this.teams.pack.Document
[error]     (which expands to)  play.api.libs.json.JsObject
[error] Error occurred in an application involving default arguments.
[error]     teams.count(Some(BSONDocument("_id" -> _id)))
4

1 回答 1

1

您正在混合JSONCollection和 BSON 值。

建议您将JSON 序列化与 结合使用JSONCollection,或者将默认BSON 序列化与 结合使用BSONCollection

弃用消息是一个警告,指示使用单独的 JSON 库,而不是之前包含在 Play 插件中的类型。

ABSONCollection可以从 Play 插件中解决,如下所示。

reactiveMongoApi.database.map(_.collection[BSONCollection]("players"))

函数MongoConnection.(db|apply)和/或ReactiveMongoApi.db已弃用,.database必须使用等效函数(返回Future[DefaultDB]而不是DefaultDB)。

于 2016-05-29T14:03:16.687 回答