如何打印 BSONDocument 的内容
How to print contents of a BSONDocument
我正在尝试使用 reactiveMongo 实现 CRUD 操作,这是我从在线教程中找到的功能。
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 }
和Play-ReactiveMongo
所以你有几个选择。看起来您使用的是 Play 框架,然后我假设 Play-ReactiveMongo 插件。如果是这样,请查看此 question 它有点不同,但我认为您可以 re-use 提交的答案中的想法。
import play.modules.reactivemongo.json.BSONFormats._
然后在您的成功案例中
case Success(result) => {
result.map { data =>
Json.toJson(data)
}
还有其他选项可以将 BSONDocuments 转换为 JSON,但 Play-ReactiveMongo 使事情变得更容易。
如果没有 Play-ReactiveMongo 插件,您将需要告诉 ReactiveMongo 如何写入和读取您的数据。为此,ReactiveMongo 使用 BSONDocumentReaders & 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
方法在它正在寻找的实体类型上是通用的,并为您的实体采用隐式 reader。
def one[T](readPreference: ReadPreference)(implicit reader: Reader[T], ec: ExecutionContext): Future[Option[T]]
所以在这个例子中它将使用从上面的宏生成的 Reader 到 return 一个 Future[Option[Person]]
而不是 Future[Option[BSONDocument]]
。然后你就可以用Play JSON把你的域名写在JSON
为了全面披露,您可以编写自己的客户编写器而不是使用宏,这些最终类似于编写 Play JSON 编写器和 readers
此答案基于 @Barry's 编辑前的先前答案:
我使用 play-reactivemongo 更新版本让它工作:
"org.reactivemongo" %% "play2-reactivemongo" % "0.11.9",
现在,
result.map { data =>
println(Json.toJson(data))
}
returns我想要的:
{"_id":0,"name":"MongoDB","type":"database","count":1,"info":{"x":203,"y":102}}
您可以在没有播放框架模块的情况下执行此操作。有一个 pretty
函数专门用于此:
result match{
case Some(document) => println(BSONDocument.pretty(document))
case None => println("No document")
}
我正在尝试使用 reactiveMongo 实现 CRUD 操作,这是我从在线教程中找到的功能。
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 }
和Play-ReactiveMongo
所以你有几个选择。看起来您使用的是 Play 框架,然后我假设 Play-ReactiveMongo 插件。如果是这样,请查看此 question 它有点不同,但我认为您可以 re-use 提交的答案中的想法。
import play.modules.reactivemongo.json.BSONFormats._
然后在您的成功案例中
case Success(result) => {
result.map { data =>
Json.toJson(data)
}
还有其他选项可以将 BSONDocuments 转换为 JSON,但 Play-ReactiveMongo 使事情变得更容易。
如果没有 Play-ReactiveMongo 插件,您将需要告诉 ReactiveMongo 如何写入和读取您的数据。为此,ReactiveMongo 使用 BSONDocumentReaders & 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
方法在它正在寻找的实体类型上是通用的,并为您的实体采用隐式 reader。
def one[T](readPreference: ReadPreference)(implicit reader: Reader[T], ec: ExecutionContext): Future[Option[T]]
所以在这个例子中它将使用从上面的宏生成的 Reader 到 return 一个 Future[Option[Person]]
而不是 Future[Option[BSONDocument]]
。然后你就可以用Play JSON把你的域名写在JSON
为了全面披露,您可以编写自己的客户编写器而不是使用宏,这些最终类似于编写 Play JSON 编写器和 readers
此答案基于 @Barry's 编辑前的先前答案:
我使用 play-reactivemongo 更新版本让它工作:
"org.reactivemongo" %% "play2-reactivemongo" % "0.11.9",
现在,
result.map { data =>
println(Json.toJson(data))
}
returns我想要的:
{"_id":0,"name":"MongoDB","type":"database","count":1,"info":{"x":203,"y":102}}
您可以在没有播放框架模块的情况下执行此操作。有一个 pretty
函数专门用于此:
result match{
case Some(document) => println(BSONDocument.pretty(document))
case None => println("No document")
}