Сопоставление с образцом после обновления с помощью ReactiveMongo - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь выполнить сопоставление с шаблоном для проверки ошибки после обновления документа на 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))

Это моя функция обновления в репозитории продуктов, и это мой контроллер

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

Моя цель - выполнить сопоставление с образцом после обновления

1 Ответ

0 голосов
/ 25 сентября 2019

Если вы посмотрите сообщение IDE / компилятора, вы увидите, что результат операции обновления равен Future[UpdateWriteResult], поэтому совпадение с Option в Future.map не может быть в порядке.

Если вы прочитаете документацию , вы найдете раздел «Обработка ошибок», объясняющий, как восстановить результат записи в соответствии с кодом БД или сообщением.

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 _ => ()
  }

Если вы пытаетесьчтобы получить конкретный ответ, если ничего не было обновлено, это не нужно делать с сопоставлением с образцом, а просто отметьте UpdateWriteResult.n (количество обновленных документов) в .map.

...