Ich benutze Reactive Mongo Version 0.11.11 und ich möchte eine Methode in meinem DAO implementieren, die alle Dokumente von _id
zählt.BSONObjectIDFormat in Merkmal BSONFormats ist veraltet
Hier ist mein 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)))
}
}
Das Problem ist, dass ich die folgende Fehlermeldung erhalten:
value BSONObjectIDFormat in trait BSONFormats is deprecated: Use [[reactivemongo.play.json.BSONFormats.BSONObjectIDFormat]]
[error] teams.count(Some(Json.obj("_id" -> _id)))
Ich versuchte, die count
Methode mit ersetzen:
def count(_id: BSONObjectID): Future[Int] = {
teams.count(Some(BSONDocument("_id" -> _id)))
}
Aber dann bekomme ich folgenden Kompilierfehler:
[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)))
Vielen Dank für Ihre Hilfe! Ich verwende Silhouette und muss "LoginInfo" als Teil eines 'Player'-Dokuments beibehalten. Nun ist das Problem, dass es in der Klasse 'LoginInfo' nur' implizites val jsonFormat = Json.format [LoginInfo] 'gibt und deshalb bekomme ich einen Typfehler, weil ich jetzt BSON und nicht JSON behandle. Hast du eine Idee, ob ich aus einem JSON eine BSON machen kann oder fehlt mir etwas? –
Nun, der einzige Grund, warum ich BSON jetzt handle, ist, weil ich irgendwie '_id' abbilden muss. Leider gibt es keinen JSON-Ersatz für 'BSONObjectID', oder? –
Wenn Sie die [doc] (http://reactivemongo.org/releases/0.11/documentation/json/overview.html) lesen, können Sie sehen, dass bei JSON die Repräsentation für ein 'BSONObjectID' ein' JsObject' ist mit '$ oid', und diese Umwandlung dafür wird von' import reacticmongo.play.json._' zur Verfügung gestellt – cchantep