/ / Comment imprimer le contenu d'un document BSONDocument - scala, playframework, bson, reactivemongo

Comment imprimer le contenu d'un BSONDocument - scala, playframework, bson, reactivemongo

Je tente de mettre en œuvre les opérations CRUD en utilisant reactiveMongo, et voici ma fonction de recherche d'un tutoriel en ligne.

def findTicker(ticker: String) = {
val query = BSONDocument("firstName" -> ticker)
val future = collection.find(query).one

future.onComplete {
case Failure(e) => throw e
case Success(result) => {
println(result)

}
}
}

Cependant, j'obtiens ce résultat:

Some(BSONDocument(<non-empty>))

Comment puis-je réellement voir les données JSON lisibles que je recherche:

{ "_id" : ObjectId("569914557b85c62b49634c1d"), "firstName" : "Stephane", "lastName" : "Godbillon", "age" : 29 }

Réponses:

2 pour la réponse № 1

Avec Play-ReactiveMongo

Donc, vous avez quelques options. Il semble que vous utilisiez le framework Play, puis le plugin Play-ReactiveMongo. Si c’est le cas, cela question C'est un peu différent, mais je pense que vous pouvez réutiliser les idées de la réponse soumise.

import play.modules.reactivemongo.json.BSONFormats._

et puis dans votre cas de réussite

case Success(result) => {
result.map { data =>
Json.toJson(data)
}

Il existe d'autres options pour convertir BSONDocuments en JSON, mais Play-ReactiveMongo facilite les choses.

Sans le plugin Play-ReactiveMongo vous devrez dire à ReactiveMongo comment écrire et lire vos données. Pour ce faire, ReactiveMongo utilise BSONDocumentReaders & BSONDocumentWriters. Ils fournissent une macro pour les générer pour la plupart des classes ce lien a plus d'infos

import reactivemongo.bson._

//lets say your domain/case class is called Person
implicit val personHandler:BSONHandler[BSONDocument,Person] = Macros.handler[Person]

Un BSONHandler rassemble les traits BSONReader et BSONWriter et vous pouvez le placer de manière implicite dans l'objet compagnon Persons.

Mongos Réactifs one method est générique sur le type d'entité recherché et utilise un lecteur implicite pour votre entité.

  def one[T](readPreference: ReadPreference)(implicit reader: Reader[T], ec:    ExecutionContext): Future[Option[T]]

Donc, dans cet exemple, il utiliserait le Reader généré à partir de la macro ci-dessus pour renvoyer une Future[Option[Person]] au lieu de Future[Option[BSONDocument]]. Ensuite, vous pouvez utiliser le JSON de lecture pour écrire votre domaine en JSON.

Pour une divulgation complète, vous pouvez écrire vos propres rédacteurs client plutôt que d'utiliser la macro. Ces derniers ressemblent à l'écriture de rédacteurs et de lecteurs Play JSON.


2 pour la réponse № 2

Vous pouvez le faire sans le module playframework. Il y a un pretty fonction spéciale pour ceci:

result match{
case Some(document) => println(BSONDocument.pretty(document))
case None => println("No document")
}

0 pour la réponse № 3

CETTE RÉPONSE EST BASÉE SUR @Barry "s RÉPONSE PRÉCÉDENTE AVANT LES RÉDACTIONS:

Je l'ai obtenu en utilisant la version mise à jour de play-reactivemongo: "org.reactivemongo" %% "play2-reactivemongo" % "0.11.9",

À présent,

result.map { data =>
println(Json.toJson(data))
}

retourne ce que je veux:

{"_id":0,"name":"MongoDB","type":"database","count":1,"info":{"x":203,"y":102}}