Scala 使用reactivemongo在mongo中查找可能的slug

Scala 使用reactivemongo在mongo中查找可能的slug,scala,playframework-2.1,reactivemongo,Scala,Playframework 2.1,Reactivemongo,我正在尝试使用Play2和reactivemongo在mongodb中查找可用的slug。 我提出了以下递归方法 private def findSlug(base: String, index: Int): String = { val slug: String = Slug({ base + "-" + index }) for { user <- findOne(BSONDocument("slug" -> slug))

我正在尝试使用Play2和reactivemongo在mongodb中查找可用的slug。 我提出了以下递归方法

  private def findSlug(base: String, index: Int): String = {
    val slug: String = Slug({
      base + "-" + index
    })
    for {
      user <- findOne(BSONDocument("slug" -> slug))
    } yield {
      user match {
        case None => slug
        case Some(user) => findSlug(base, index+1)

      }
    }
  }

正确且惯用的解决方案是什么?

我个人认为,将返回类型设置为a
Future[String]
是正确的方法-这意味着你可以尽可能长时间地保持整个“反应式”、一元式、未来链的东西(使用Play 2,这可以一直到控制器级别-棒极了)

我假设您的
findOne()
方法只是某个反应式Mongo查询的包装器,该查询将在某个时刻返回
Future[Option[T]

考虑到这一点,唯一真正的问题是,两个不同的
案例
s产生了不同程度的
未来
y

这是我想到的。它起作用了;它是地道的吗?你告诉我

private def findSlug(base: String, index: Int): Future[String] = {

  // Slug stuff omitted

  findOne(BSONDocument("slug" -> slug)).flatMap { _ match {
      case None => Future.successful(slug)
      case Some(_) => findSlug(base, index+1)
    } 
  }
}
[error]  found   : scala.concurrent.Future[String]
[error]  required: String
[error]         case Some(user) => findSlug(base, index+1)
[error]                                    ^
private def findSlug(base: String, index: Int): Future[String] = {

  // Slug stuff omitted

  findOne(BSONDocument("slug" -> slug)).flatMap { _ match {
      case None => Future.successful(slug)
      case Some(_) => findSlug(base, index+1)
    } 
  }
}