Выполнение необработанных команд в коллекции MongoDb из Play 2 с использованием ReactiveMongo и JSONCollection.

Привет, я использую 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))
                                                    ^

Может ли кто-нибудь помочь мне найти способ выполнения необработанных команд в коллекции MongoDB из Play с помощью ReactiveMongo, пожалуйста?


person Antonin    schedule 13.09.2016    source источник


Ответы (1)


Документация по необработанной команде доступна онлайн для сериализации 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]
}
person cchantep    schedule 13.09.2016