如何在 Play Framework 中使用 ReactiveMongo + JSON 聚合框架?
How to use ReactiveMongo + JSON aggregation framework in Play Framework?
我需要使用 MongoDB 的聚合框架和 ReactiveMongo。我只找到使用 BSON 的 this example。我想使用 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" 类型。
完成此方法的正确方法是什么?
当您使用 JSONSerializationPack
时,JSONDocument
与 JsObject
相同。 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/#subtract-numbers 中执行带有 'total' 排序的示例
使用 play reactive 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
}
}
我需要使用 MongoDB 的聚合框架和 ReactiveMongo。我只找到使用 BSON 的 this example。我想使用 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" 类型。
完成此方法的正确方法是什么?
JSONSerializationPack
时,JSONDocument
与 JsObject
相同。 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/#subtract-numbers 中执行带有 'total' 排序的示例 使用 play reactive 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
}
}