在 ReactiveMongo 0.12.5 中使用 Raw 命令更新
Update with Raw Command in ReactiveMongo 0.12.5
我目前无法使用 Play JSON 在 ReactiveMongo 0.12.5 中 运行 Raw Command
插件。 documentation (Run a raw command) 目前无法访问,但从我浏览器的缓存页面中我可以看到以下内容:
import scala.concurrent.{ ExecutionContext, Future }
import play.api.libs.json.{ JsObject, Json }
import reactivemongo.play.json._
import reactivemongo.api.commands.Command
def rawResult(db: reactivemongo.api.DefaultDB)(implicit ec: ExecutionContext): 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) // run is since deprecated
runner.apply(db, runner.rawCommand(commandDoc)).one[JsObject] // one is since deprecated
}
但是我不希望 return JsObject
(或任何其他东西)- 我实际上想更新另一个集合中的所有文档,如 this previous answer 所示。我的问题是这两种方法都包含 已弃用的函数 因此我将它们组合在一起(可能)与 JSON Collections 一起使用(如前所述):
def bulkUpdateScoreBA(scoreBAs: List[ScoreBA]) = {
def singleUpdate(scoreBA: ScoreBA) = Json.obj(
("q" -> Json.obj("_id" ->
Json.obj("$oid" -> scoreBA.idAsString(scoreBA._id))
)),
("u" ->
Json.obj("$set" ->
Json.obj("scoreBA" -> scoreBA.scoreBA)
)
)
)
val commandJson = Json.obj(
"update" -> "rst",
"updates" -> Json.arr(scoreBAs.map(singleUpdate)),
"ordered" -> false,
"writeConcern" -> Json.obj("w" -> "majority", "wtimeout" -> 5000)
)
val runner = Command.CommandWithPackRunner(JSONSerializationPack)
runner.apply(db, runner.rawCommand(commandJson)) // ?? how to get a Future[Unit] here
}
但是我需要这个 return Future[Unit]
以便我可以从控制器调用它但是我找不到这是如何完成的,即使我到目前为止所做的是最好的方法。感谢您的帮助!
Scaladoc for bulk update is available (since 0.12.7), with example in tests.
我目前无法使用 Play JSON 在 ReactiveMongo 0.12.5 中 运行 Raw Command
插件。 documentation (Run a raw command) 目前无法访问,但从我浏览器的缓存页面中我可以看到以下内容:
import scala.concurrent.{ ExecutionContext, Future }
import play.api.libs.json.{ JsObject, Json }
import reactivemongo.play.json._
import reactivemongo.api.commands.Command
def rawResult(db: reactivemongo.api.DefaultDB)(implicit ec: ExecutionContext): 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) // run is since deprecated
runner.apply(db, runner.rawCommand(commandDoc)).one[JsObject] // one is since deprecated
}
但是我不希望 return JsObject
(或任何其他东西)- 我实际上想更新另一个集合中的所有文档,如 this previous answer 所示。我的问题是这两种方法都包含 已弃用的函数 因此我将它们组合在一起(可能)与 JSON Collections 一起使用(如前所述):
def bulkUpdateScoreBA(scoreBAs: List[ScoreBA]) = {
def singleUpdate(scoreBA: ScoreBA) = Json.obj(
("q" -> Json.obj("_id" ->
Json.obj("$oid" -> scoreBA.idAsString(scoreBA._id))
)),
("u" ->
Json.obj("$set" ->
Json.obj("scoreBA" -> scoreBA.scoreBA)
)
)
)
val commandJson = Json.obj(
"update" -> "rst",
"updates" -> Json.arr(scoreBAs.map(singleUpdate)),
"ordered" -> false,
"writeConcern" -> Json.obj("w" -> "majority", "wtimeout" -> 5000)
)
val runner = Command.CommandWithPackRunner(JSONSerializationPack)
runner.apply(db, runner.rawCommand(commandJson)) // ?? how to get a Future[Unit] here
}
但是我需要这个 return Future[Unit]
以便我可以从控制器调用它但是我找不到这是如何完成的,即使我到目前为止所做的是最好的方法。感谢您的帮助!
Scaladoc for bulk update is available (since 0.12.7), with example in tests.