如何打印 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")
}