2016-09-13 4 views
0

Привет Я использую ReactiveMongo и Play, и я хотел бы иметь возможность запускать команду MongoDB в коллекции.Выполнение необработанных команд в коллекции MongoDb из Play 2 с использованием ReactiveMongo и JSONCollection

Моя коллекция объявляется так:

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) 
} 

Когда я пытаюсь выполнить команду, я получаю длинное сообщение об ошибке, которое в основном с AYS что 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 из игры с помощью ReactiveMongo, пожалуйста?

ответ

1

Документация об исходной команде - available online для сериализации 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] 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^