Как использовать платформу агрегации ReactiveMongo + JSON в Play Framework?

Мне нужно использовать структуру агрегации MongoDB, используя ReactiveMongo. Я нахожу только этот пример, который использует BSON. Я хотел бы использовать JSON, поэтому я изменил код:

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".

Каков был бы правильный способ закончить этот подход?

2 ответа

Решение

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

Например, вы хотите выполнить пример из https://docs.mongodb.com/v3.4/reference/operator/aggregation/subtract/ с сортировкой "total". Использование play activitve mongo 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
  }
}
Другие вопросы по тегам