在ReactiveMongo中使用Raw命令进行更新0.12.5

时间:2018-02-19 16:32:02

标签: mongodb reactivemongo play-reactivemongo

我目前无法使用 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
   }

但是我不打算返回JsObject(或其他任何事实) - 我实际上想要更新另一个集合中的所有文档,如this previous answer所示。我的问题是两个方法都包含不推荐使用的函数,因此我将一个组合(可能)与 JSON集合(如上所述)一起组合:

  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

  }

但是我需要这个来返回一个Future[Unit],这样我就可以从控制器中调用它,但我找不到这是怎么做的,或者即使我到目前为止做的是最好的方法。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:0)

Scaladoc for bulk update可用(自0.12.7起),example in tests