gpt4 book ai didi

mongodb - Play 和 ReactiveMongo 嵌套 future 响应的编译器错误

转载 作者:可可西里 更新时间:2023-11-01 09:31:48 25 4
gpt4 key购买 nike

我有一个 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 block ):

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但我认为这是在数据库操作完成之前返回响应,我不希望这样。

最佳答案

尝试改变这一行:

futureResult.map { result =>

对此:

futureResult.flatMap { result =>

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

关于mongodb - Play 和 ReactiveMongo 嵌套 future 响应的编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18206589/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com