使用 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(更新文档数)。