2016-07-21 20 views
0

BSONArrayからJSONテキストを返す最も速い方法は何ですか?Return ReactiveMongo Play FrameworkのJSON

私は非常に大きなJSON文書を返しています。

Ok(result.toTextJSON).as(MimeTypes.JSON) 

ここ更新私の完全なコード:

を私は速いのようなものになると思います

val result:BSONArray = .... 
Ok(Json.toJson(result)) 

を:それはPlayJsValue

は今、私はこのように戻ってる処理を省略することができます

val command = Json.parse(s""" { 
    "aggregate": "$collection", 
    "pipeline": [ 
    { "$$match": { "$$and" : [ 
     { "${RootAttrs.TIME}" : { "$$gt": $startSecTime }}, 
     { "${RootAttrs.TIME}" : { "$$lt": $endSecTime }}, 
     { "${RootAttrs.COMMAND}" : { "$$eq": ${toCmd(Command.GPS_COORDINATES)} }} 
    ] 
    }}, 
    { "$$sort": { "${RootAttrs.TIME}" : 1 }}, 
    { "$$limit": $MAX_GPS_ALL_DATA }, 
    { "$$project" : { "_id":0, "${RootAttrs.TIME}":1, "${RootAttrs.COMMAND}":1, "${RootAttrs.VALUE}":1, "${RootAttrs.IGNITION}":1, "${RootAttrs.SIM_NUMBER}":1 } } 
]}""") 

db.command(RawCommand(BSONDocumentFormat.reads(command).get)).map { out => 
    out.get("result").map { 
    case result: BSONArray => 
     Logger.debug("Loaded all GPS history data size: " + result.length) 
     Ok(Json.toJson(result)) // <- I need just return JSON, parsing to JsValue can take some time 

    case _ => 
     Logger.error("Result GPS history data not array") 
     BadRequest 

    }.getOrElse(BadRequest) 
} 
+0

はあなたがここでより包括的なコード例を追加していただけますか? – marcospereira

答えて

-1

中間のJsVを作成する手順を省略することができます独自の書き込み可能ファイルを作成し、その文字列を手動で出力したい場合はalueを使用します。ここで

はあなたが大規模なを扱っている場合は上記の応答は[「1」、「2」、「3」]

であるあなたの必要性に合わせてカスタマイズすることができ、簡単な例

val result: BSONArray = BSONArray("one", "two", "three") 

def convertBsonArrayToString(jsval: BSONArray): Array[Byte] = { 
    // this method assumes I have a BSONArray of Strings (which you may not) 
    var strs: Stream[String] = jsval.stream.map(_.get match { case s: BSONString => s.value }) 
    var json: String = strs.mkString("[\"", "\",\"", "\"]") 
    json.getBytes() 
} 

implicit def writeableOf_BSONArray: Writeable[BSONArray] = { 
    Writeable(convertBsonArrayToString ,Some("application/json")) 
} 

def doStuff = action { 
    Results.Ok(result) 
} 

ですデータ - Enumeratorを使用して、より良い応答をストリーミングすることもできます。

は、以下を参照してください。https://www.playframework.com/documentation/2.5.x/ScalaStream

+0

それは車輪を再発明するように私に見えます。 – cchantep

関連する問題