【问题标题】:Compiler error on nested futures response with Play and ReactiveMongo使用 Play 和 ReactiveMongo 嵌套期货响应时出现编译器错误
【发布时间】:2013-08-14 22:06:52
【问题描述】:

我有一个 mongo 条目,其中一个字段是一个列表。如果条目不存在,我想添加一个新条目。如果存在,我想在列表中添加一个新元素。

最后我想向客户端返回一个 Ok,但只有在操作成功完成之后。不是一个严格的要求,但在我看来,这对用户来说是最有意义的。

这是我目前拥有的 - 它可以工作,但在更新时它会覆盖旧列表,而不是附加新元素。

def myMethod(value:String, value2:String) = Action {

  Async {
    val myElement = Json.obj(
      "key" -> value2
    )

    val myDBEntry = Json.obj(
      "key" -> value,
      "list" -> List(myElement)
    )

    collection.update(Json.obj("key" -> value), myDBEntry, upsert = true).map(lastError =>
      Ok("Mongo LastError: %s".format(lastError)))
  }
}

为了检查列表是否存在并附加元素/创建一个新列表,我开始使用类似的东西(这替换了之前代码中的 collection.update 块):

val futureResult:Future[Option[JsObject]] = collection.find(Json.obj("key" -> value)).one[JsObject]

futureResult.map { result =>

  if (result.isEmpty) {
      collection.insert(myDBEntry).map(lastError =>
        Ok("Mongo LastError: %s".format(lastError)))


  } else {
      //this not the correct command yet - but compiler already fails because method is not returning correct future 
      collection.update(Json.obj("key" -> value), myDBEntry, upsert = true).map(lastError =>
        Ok("Mongo LastError: %s".format(lastError)))
  }


}

但编译器似乎不喜欢这种嵌套:“类型不匹配,预期:Future[Result],实际:Future:[Future[SimpleResult[Nothing]]]”

反正我觉得这种方式有点别扭,一定有更优雅的方式来解决这个问题,但我是 Futures 和 ReactiveMongo 的新手,不知道。我该如何解决?

编辑: 我还找到了this post,但我认为这是在数据库操作完成之前返回响应,我不希望这样。

【问题讨论】:

    标签: mongodb scala playframework-2.1 future reactivemongo


    【解决方案1】:

    尝试更改此行:

    futureResult.map { result =>
    

    到这里:

    futureResult.flatMap { result =>
    

    当您在未来执行地图并且在该地图块内返回另一个未来时,您需要使用 flatMap 代替,因为它会使嵌套变平。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-08
      • 2021-05-15
      • 2013-10-14
      • 2018-07-29
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多