不推荐使用特征BSONFormats中的BSONObjectIDFormat

时间:2016-05-29 11:36:24

标签: mongodb scala playframework reactivemongo play-reactivemongo

我正在使用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)))

1 个答案:

答案 0 :(得分:1)

您正在混合JSONCollection和BSON值。

建议您将JSON serializationBSONCollection一起使用,或将默认BSON serializationBSONCollection一起使用。

  

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

可以从Play插件解析reactiveMongoApi.database.map(_.collection[BSONCollection]("players")) ,如下所示。

MongoConnection.(db|apply)
  

不推荐使用ReactiveMongoApi.db和/或.database函数,必须使用等效的Future[DefaultDB](返回DefaultDB而不是{{1}})。< / p>