2016-03-22 2 views
1

Мне нужно использовать структуру агрегации MongoDB с помощью ReactiveMongo. Я нахожу только this example, который использует BSON. Я хотел бы использовать JSON, поэтому я изменил код:Как использовать структуру агрегации ReactiveMongo + JSON в Play Framework?

def populatedStates(col: JSONCollection) = { 
    import col.BatchCommands.AggregationFramework.{AggregationResult, Group, Match, SumField} 
    val res: Future[AggregationResult] = col.aggregate(
    Group(JsString("$state"))("totalPop" -> SumField("population")), 
    List(Match(JSONDocument("totalPop" -> JSONDocument("$gte" -> 10000000L))))) 
    res.map(_.firstBatch) 
} 

Но нет никакого типа «JSONDocument».

Что было бы правильным способом завершить этот подход?

ответ

4

JSONDocument такое же, как JsObject при использовании JSONSerializationPack. JsObject преобразует в JSONDocument с неявным писателем.

import play.api.libs.json._ 
import reactivemongo.play.json._ 
import reactivemongo.play.json.collection.JSONCollection 

import scala.concurrent.Future 

def populatedStates(col: JSONCollection) = { 
    import col.BatchCommands.AggregationFramework.{AggregationResult, Group, Match, SumField} 
    val res: Future[AggregationResult] = col.aggregate(
    Group(JsString("$state"))("totalPop" -> SumField("population")), 
    List(Match(Json.obj("totalPop" -> Json.obj("$gte" -> 10000000L))))) 
    res.map(_.firstBatch) 
} 
+0

Это то, что я сделал, но я ве получил сообщение об ошибке. Я задал новый вопрос с моим собственным кодом здесь: http://stackoverflow.com/questions/36184408/get-an-error-message-while-tring-to-rewrite-reactivemongo-bson-to-json- in-play –

+0

Спасибо большое! Не удалось найти решение в другом месте :) – phidias

1

Например, вы хотите выполнить пример из https://docs.mongodb.com/v3.4/reference/operator/aggregation/subtract/#subtract-numbers с «общей» сортировочного Использование игры reacitve Монго 0.12.0 он должен выглядеть, как

// don't forget to import this !! 
import reactivemongo.play.json.commands.JSONAggregationFramework._ 

def salesDb = reactiveMongoApi.database.map(_.collection[JSONcollection]("sales")) 

val result = salesDb.flatMap { collection => 
    val projectOperator = Project(
    Json.obj(
     "item" -> 1, 
     "total" -> Json.obj("$subtract" -> JsArray(Seq(Json.obj("$add" -> Seq("$price", "$fee")), JsString("$discount")))) 
    ) 
) 
    val sortOperator = Sort(Ascending("total")) 
    collection.aggregate(firstOperator = projectOperator, otherOperators = List(sortOperator)).map { agregationResult => 
    agregationResult.firstBatch 
    } 
} 
Смежные вопросы