特征 BSONFormats 中的 BSONObjectIDFormat 已弃用

BSONObjectIDFormat in trait BSONFormats is deprecated

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

您正在混合 JSONCollection 和 BSON 值。

建议您使用 JSON serialization with JSONCollection, or you use the default BSON serializationBSONCollection

The deprecation message is a warning indicating to use the separate JSON library, instead of the former types previously included in the Play plugin.

一个BSONCollection可以从Play插件中解析如下。

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

The functions MongoConnection.(db|apply) and/or ReactiveMongoApi.db are deprecated, and the equivalent .database must be used (which returns Future[DefaultDB] instead of DefaultDB).