Получить идентификатор после вставки с ReactiveMongo

Я пишу веб-сервис с помощью akka-http и ReactiveMongo. Я столкнулся с проблемой, которую сам не смог решить.

У меня есть метод

 def saveRoute(route: Route)(implicit writer: BSONDocumentWriter[Route]): Future[WriteResult] = {
    collection.insert(route)
  }

Проблема в WriteResult не содержит никакой полезной информации, кроме ошибки или статуса OK.

Не могли бы вы объяснить, как получить ID объекта после вставки. Все примеры, которые я нашел, связаны либо со старой версией с LastError или с игрой! Фреймворк.

2 ответа

Решение

Мне удалось получить идентификатор или любое другое поле, или даже весь объект, вернув кортеж из метода сохранения.

def saveRoute(route: Route)(implicit writer: BSONDocumentWriter[Route]) = {
    collection.insert(route).map((_, route))
  }

Я копирую Route сущность и назначить сгенерированный идентификатор перед вызовом saveRoute

route.copy(id = Some(BSONObjectID.generate().stringify))

Этот подход позволяет мне получить и WriteResult, и сохраненную сущность.

Это (довольно распространенный) выбор дизайна, сделанный ReactiveMongo.

Рекомендуемое решение - предоставить идентификатор самостоятельно, используя BSONObjectID.generateвместо того, чтобы позволить БД создать один для вас.

Вот пример из документации ReactiveMongo: http://reactivemongo.org/releases/0.11/documentation/tutorial/write-documents.html

val id = BSONObjectID.generate
val person = Person(
  id,
  "Stephane",
  "Godbillon",
  29)

val future = collection.insert(person)

future.onComplete {
  case Failure(e) => throw e
  case Success(lastError) => {
    println(s"successfully inserted document with id $id)
  }
}
Другие вопросы по тегам