2016-09-13 13 views
0

안녕하세요 ReactiveMongo 및 Play를 사용하고 있는데 컬렉션에서 MongoDB 명령을 실행하고 싶습니다.ReactiveMongo 및 JSONCollection을 사용하여 Play 2의 MongoDb 컬렉션에서 원시 명령을 실행하십시오.

내 컬렉션처럼 선언 :

val commandDocument = Json.obj(
    "geoNear" -> "thingsCollection", 
    "near" -> Json.obj(
     "type" -> "Point", 
     "coordinates" -> Seq(lon, lat)), 
    "spherical" -> true, 
    "minDistance" -> 0, 
    "maxDistance" -> 5000 
) 

을 그리고 마지막으로, 여기에 컴파일되지 않는 코드는 다음과 같습니다 :

def thingsJSONCollection : Future[JSONCollection] = 
    database.map(connectedDb => 
    connectedDb.collection[JSONCollection]("thingsCollection") 
) 

내가 실행하고 싶은 명령은 그렇게 선언

thingsJSONCollection.map{ 
    collection => collection.runCommand(commandDocument) 
} 

명령을 실행하려고하면 기본적으로 긴 오류 메시지가 표시됩니다. runCommand 그 AYS는 인수로 JsObject을 허용하지 않습니다

Error:(618, 57) overloaded method value runCommand with alternatives: 
    [C <: reactivemongo.api.commands.CollectionCommand](command: C)(implicit writer: collection.pack.Writer[reactivemongo.api.commands.ResolvedCollectionCommand[C]])reactivemongo.api.commands.CursorFetcher[collection.pack.type,reactivemongo.api.Cursor] <and> 
    [R, C <: reactivemongo.api.commands.CollectionCommand with reactivemongo.api.commands.CommandWithResult[R]](command: C with reactivemongo.api.commands.CommandWithResult[R])(implicit writer: collection.pack.Writer[reactivemongo.api.commands.ResolvedCollectionCommand[C]], implicit reader: collection.pack.Reader[R], implicit ec: scala.concurrent.ExecutionContext)scala.concurrent.Future[R] 
cannot be applied to (play.api.libs.json.JsObject) 
    thingsJSONCollection.map(collection => collection.runCommand(commandDocument)) 
                ^

사람이 나에게, ReactiveMongo 사용하여 플레이에서 MongoDB의 컬렉션 원시 명령을 실행하는 방법 좀 찾을 수 있을까요?

답변

1

원시 명령에 대한 문서는 BSON 직렬화의 경우 available online입니다. JSON 직렬화에 맞게 조정할 수 있습니다.

import scala.concurrent.Future 
import scala.concurrent.ExecutionContext.Implicits.global 

import play.api.libs.json.{ JsObject, Json } 

import reactivemongo.play.json._ 
import reactivemongo.api.commands.Command 

def rawResult(db: reactivemongo.api.DefaultDB): Future[JsObject] = { 
    val commandDoc = Json.obj(
    "aggregate" -> "orders", // we aggregate on collection `orders` 
    "pipeline" -> List(
     Json.obj("$match" -> Json.obj("status" -> "A")), 
     Json.obj(
     "$group" -> Json.obj(
      "_id" -> "$cust_id", 
      "total" -> Json.obj("$sum" -> "$amount"))), 
     Json.obj("$sort" -> Json.obj("total" -> -1)) 
    ) 
) 
    val runner = Command.run(JSONSerializationPack) 

    runner.apply(db, runner.rawCommand(commandDoc)).one[JsObject] 
}