0

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))) 

Antwort

1

Sie mischen JSONCollection und BSON-Werte. entweder

Es unverbindliche, dass Sie die JSON serialization mit JSONCollection verwenden oder verwenden Sie den Standard BSON serialization mit BSONCollection.

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

A BSONCollection kann wie folgt aus der Play-Plugin behoben werden.

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).

+0

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? –

+0

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? –

+0

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