【问题标题】:How to print contents of a BSONDocument如何打印 BSONDocument 的内容
【发布时间】:2016-01-15 16:16:42
【问题描述】:

我很想使用 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 }

【问题讨论】:

  • BSONDocument.pretty(bsonDoc)

标签: scala playframework bson reactivemongo


【解决方案1】:

你可以在没有 playframework 模块的情况下做到这一点。有一个pretty 函数专门用于此:

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

【讨论】:

    【解决方案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 和 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 编写器和读取器

    【讨论】:

    • 想到一件事,让我知道您正在使用的 Play 版本,他们的 JSON 库在最近的版本中发生了变化,因此 Play-ReactiveMongo 已经更新。上面的导入适用于旧版本的 Play
    • 我使用的是响应式mongo驱动程序而不是播放模块:(
    • 我的PLAY版本是2.4.6
    • 感谢您的示例。我觉得这有点复杂。您之前使用 play-reactivemongo 的示例更有意义。你认为我可以在我的 Play 版本中使用前面的示例吗?
    • 看来您有任何问题/cmets,请随时与我们联系
    【解决方案3】:

    此答案基于@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}}

    【讨论】:

      猜你喜欢
      • 2019-08-29
      • 2021-07-04
      • 2014-06-04
      • 2020-09-08
      • 2020-04-13
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多