0

こんにちは、私は ReactiveMongo と Play を使用しています。MongoDB コマンドをコレクションで実行できるようにしたいと考えています。

私のコレクションは次のように宣言されています:

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

実行したいコマンドは次のように宣言されています:

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

最後に、コンパイルされないコードを次に示します。

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

コマンドを実行しようとすると、基本的にそれが引数としてrunCommand受け入れられないことを示す長いエラーメッセージが表示されます。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 を使用して、Play から MongoDB コレクションで生のコマンドを実行する方法を見つけるのを手伝ってくれませんか?

4

1 に答える 1

1

raw コマンドに関するドキュメントは、BSON シリアライゼーション用にオンラインで入手できます。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]
}
于 2016-09-13T15:49:46.810 に答える