2016-01-15 158 views
0

我打算使用reactiveMongo來實現CRUD操作,這裏是我的在線教程的查找功能。如何打印BSONDocument的內容

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數據,我looing爲:

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

+1

'BSONDocument.pretty(bsonDoc)'的一件事 – cchantep

回答

0

本答案基於@Barry's以前的答案的編輯前:

我得到了它使用播放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}}

2

隨着播放-ReactiveMongo

所以你有幾個選擇。它看起來像你使用Play框架,然後我假設Play-ReactiveMongo插件。如果是這種情況結帳這question它有點不同,但我認爲你可以重複使用提交的答案的想法。

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

,然後在你的成功案例

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

還有其他的選擇,以BSONDocuments轉換成JSON,但播放-ReactiveMongo使事情變得更容易。

沒有Play-ReactiveMongo插件您需要告訴ReactiveMongo如何編寫和讀取您的數據。要做到這一點ReactiveMongo使用BSONDocumentWriters使用BSONDocumentReaders &。他們提供了一個宏來生成這些對於大多數類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特質,你可以把這個隱含的人員伴侶的對象。

ReactiveMongos one方法對於它正在查找的實體類型是通用的,並且爲您的實體使用隱式讀取器。

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

因此,在這個例子中,將使用從上面的宏所產生的閱讀器返回的Future[Option[Person]]代替Future[Option[BSONDocument]]。然後你可以使用播放JSON來寫你的域JSON

充分披露,你可以寫你自己的客戶作家,而不是使用宏而這些最終會被類似於編寫播放JSON作家與讀者

+1

思想讓我知道玩的版本使用的是自己的JSON庫在最新版本的改變,從而播放,ReactiveMongo有已更新。上面的導入將用於老版本播放 – Barry

+0

我使用的是reactivemongo驅動程序,而不是播放模塊:( – summerNight

+0

我的播放版本是2.4.6 – summerNight

2

你可以做到這一點沒有playframework模塊。有此一pretty功能specialy:

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