Получить идентификатор после вставки с 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)
}
}