我正在使用reactiveMongo来实现CRUD操作,这是我在线教程中的find函数。
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)
}
}
}
但是我得到了这个结果:
Some(BSONDocument(<non-empty>))
如何实际查看我正在阅读的实际可读JSON数据:
{ "_id" : ObjectId("569914557b85c62b49634c1d"), "firstName" : "Stephane", "lastName" : "Godbillon", "age" : 29 }
答案 0 :(得分:3)
您可以在没有playframework模块的情况下执行此操作。对此有一个pretty
函数:
result match{
case Some(document) => println(BSONDocument.pretty(document))
case None => println("No document")
}
答案 1 :(得分:2)
使用Play-ReactiveMongo
所以你有几个选择。看起来你使用Play框架,然后我假设Play-ReactiveMongo插件。如果是这样的情况结帐这个question它有点不同但我认为你可以重复使用提交的答案中的想法。
import play.modules.reactivemongo.json.BSONFormats._
然后在你的成功案例中
case Success(result) => {
result.map { data =>
Json.toJson(data)
}
还有其他选项可以将BSONDocuments转换为JSON,但Play-ReactiveMongo可以让事情变得更轻松。
如果没有Play-ReactiveMongo插件,您需要告诉ReactiveMongo如何写入和读取您的数据。要做到这一点,ReactiveMongo使用BSONDocumentReaders&amp; BSONDocumentWriters。它们提供了一个宏来为大多数类this link has more info
生成这些import reactivemongo.bson._
//lets say your domain/case class is called Person
implicit val personHandler:BSONHandler[BSONDocument,Person] = Macros.handler[Person]
BSONHandler收集BSONReader和BSONWriter特征,您可以将其隐含在Persons伴侣对象中。
ReactiveMongos one
方法在其正在寻找的实体类型上是通用的,并为您的实体提供隐式阅读器。
def one[T](readPreference: ReadPreference)(implicit reader: Reader[T], ec: ExecutionContext): Future[Option[T]]
因此,在此示例中,它将使用从上面的宏生成的Reader返回Future[Option[Person]]
而不是Future[Option[BSONDocument]]
。然后,您可以使用Play JSON以JSON
对于完全披露,您可以编写自己的客户编写者而不是使用宏,这些最终类似于编写Play JSON编写者和读者
答案 2 :(得分:0)
在编辑之前,此答案基于@Barry's以前的答案:
我使用play-reactivemongo更新版本让它工作:
"org.reactivemongo" %% "play2-reactivemongo" % "0.11.9",
现在,
result.map { data =>
println(Json.toJson(data))
}
返回我想要的内容:
{"_id":0,"name":"MongoDB","type":"database","count":1,"info":{"x":203,"y":102}}