使用 ReactiveMongo 更新后的模式匹配
Pattern matching after update with ReactiveMongo
我尝试在 mongodb 上使用 scala 更新文档后进行模式匹配以检查错误。
def update(id: BSONObjectID, post: Post): Future[WriteResult] =
collection.flatMap(_.update.one(BSONDocument("_id" -> id), BSONDocument(
f"$$set" -> BSONDocument(
"title" -> post.title,
"description" -> post.description
)
),
true))
这是我在 productrepository 中的更新功能,这是我的控制器
def update (id: String) = Action.async(parse.json) { /*implicit request =>*/
val bsonId = BSONObjectID.parse(id)
_.body.validate[Post].map { post =>
postsRepo.update(bsonId.get, post).map {
case Some(post) => Ok(Json.toJson(post))
case _ => NotFound
// _ => Created
}
}.getOrElse(Future.successful(BadRequest("Invalid Format")))
}
我得到这个错误:
constructor cannot be istantiated to expected type;
Found Some[A]
Required Reactivemongo.api.command.writeResult
我的目标是运行更新后的模式匹配
如果您查看 IDE/compiler 消息,您可以看到 update operation 的结果是 Future[UpdateWriteResult]
,因此在 Future.map
中匹配 Option
不可能。
如果你阅读documentation,你会发现一个"error handling"部分,解释了如何根据数据库代码或消息恢复写入结果。
val done: Future[Unit] = future.map(_ => {}).recover {
case WriteResult.Code(11000) =>
// if the result is defined with the error code 11000 (duplicate error)
println("Match the code 11000")
case WriteResult.Message("Must match this exact message") =>
println("Match the error message")
case _ => ()
}
如果您尝试在没有任何更新的情况下生成特定响应,则不能使用模式匹配来完成,而只需检查 .map
中的 UpdateWriteResult.n
(更新文档数)。
我尝试在 mongodb 上使用 scala 更新文档后进行模式匹配以检查错误。
def update(id: BSONObjectID, post: Post): Future[WriteResult] =
collection.flatMap(_.update.one(BSONDocument("_id" -> id), BSONDocument(
f"$$set" -> BSONDocument(
"title" -> post.title,
"description" -> post.description
)
),
true))
这是我在 productrepository 中的更新功能,这是我的控制器
def update (id: String) = Action.async(parse.json) { /*implicit request =>*/
val bsonId = BSONObjectID.parse(id)
_.body.validate[Post].map { post =>
postsRepo.update(bsonId.get, post).map {
case Some(post) => Ok(Json.toJson(post))
case _ => NotFound
// _ => Created
}
}.getOrElse(Future.successful(BadRequest("Invalid Format")))
}
我得到这个错误:
constructor cannot be istantiated to expected type;
Found Some[A]
Required Reactivemongo.api.command.writeResult
我的目标是运行更新后的模式匹配
如果您查看 IDE/compiler 消息,您可以看到 update operation 的结果是 Future[UpdateWriteResult]
,因此在 Future.map
中匹配 Option
不可能。
如果你阅读documentation,你会发现一个"error handling"部分,解释了如何根据数据库代码或消息恢复写入结果。
val done: Future[Unit] = future.map(_ => {}).recover {
case WriteResult.Code(11000) =>
// if the result is defined with the error code 11000 (duplicate error)
println("Match the code 11000")
case WriteResult.Message("Must match this exact message") =>
println("Match the error message")
case _ => ()
}
如果您尝试在没有任何更新的情况下生成特定响应,则不能使用模式匹配来完成,而只需检查 .map
中的 UpdateWriteResult.n
(更新文档数)。