найти с реактивным монго и игровым фреймворком

Я хочу получить данные пользователя по его почте из MongoDB, используя драйвер ReactiveMongo для игровой платформы, но он возвращает: Future(<not completed>)

Вот мой код:

def findBymail(email: String) = {
  val query = Json.obj("mail" -> email)
  val resul = collection.flatMap(_.find(query).one[Users])
  Logger.warn(s"result found: $res") 
}

person mohamedali10    schedule 08.03.2018    source источник
comment
На самом деле ваш findBymail возвращает Unit, а не возвращает результат find, который является Future[Option[Users]] (как предназначено для асинхронного запроса)   -  person cchantep    schedule 08.03.2018


Ответы (1)


Все операции в ReactiveMongo являются асинхронными, они всегда возвращают Future, поэтому вы можете распечатать результат с помощью

collection.flatMap(_.find(query).one[Users]).map{ u => Logger.warn(s"result found: $res")

Я думаю, что это может быть вам не нужно, вы также можете вернуть Future и обработать результат,

def findBymail(email: String) = {
  val query = Json.obj("mail" -> email)
  collection.flatMap(_.find(query).one[Users]).map{ user =>
      Logger.warn(s"result found: $user") 
      user
  }
}

Вы можете обработать результат как:

findBymail("....").map{ user =>
    ......
}
person Gary Gan    schedule 08.03.2018
comment
спасибо, это работает, но я не понимаю, почему вы использовали метод .map с плоской картой. Я думал, что метод .flatMap справится с этим. - person mohamedali10; 08.03.2018
comment
коллекция - это Future[Collection], здесь collection.flatMap вернет Future[User], - person Gary Gan; 08.03.2018
comment
потому что _find.... возвращает Future[User], flatMap будет сглаживать Future[Future[User]] до Future[User], поэтому я могу использовать карту после flatMap - person Gary Gan; 08.03.2018