При вставке значения в уровень сохранения и возвращении объекта результата обычно рекомендуется извлекать вновь созданный объект вместо повторного ввода входных данных.Вставка документа с повторной обработкой и извлечение его после этого
Когда я пытаюсь сделать это в Scala, используя реактивный момент, я натыкаюсь на свои языковые навыки.
def create(user: User): Future[User] = {
val newUser = user.createOID()
collection.insert(newUser).map {
case ok if ok.ok => {
for {
createdUser <- this.findOne(BSONDocument("_id" -> newUser._id))
} yield {
createdUser match {
case None => throw new RuntimeException("Could not find just created user")
case Some(x) => x
}
}
}
case error => throw new RuntimeException(error.message)
}
}
Где findOne имеет подпись:
def findOne(query: BSONDocument): Future[Option[User]]
Я получаю следующее сообщение об ошибке:
[error] found : scala.concurrent.Future[models.User]
[error] required: models.User
[error] createdUser <- this.findOne(BSONDocument("_id" -> newUser._id))
[error] ^
Если я вернуть NEWUSER объект все в порядке.
Я думаю, что у меня есть общее недоразумение, что здесь происходит - возможно, есть лучший способ получить созданный объект за один выстрел.
спасибо много - это выглядит красиво, логично и работает! – DanielKhan
Создание уникального идентификатора, который должен быть уникальным в какой-либо другой системе, - идея dab. Какова гарантия того, что этот createOID будет генерировать уникальную строку, которая будет уникальной в MongoDB? – sparkr