使用reactivemongo在mongo中找到可能的slug

时间:2013-11-15 10:43:19

标签: 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))
    } yield {
      user match {
        case None => slug
        case Some(user) => findSlug(base, index+1)

      }
    }
  }

我收到以下错误

found   : scala.concurrent.Future[String]
required: String
        user <- findOne(BSONDocument("slug" -> slug))
             ^

我通过改变返回类型,映射产量的结果等来玩了很多,但不知何故,我认为可能有一个更简单,更简洁和正确的解决方案。 这一切都归结为有一个递归函数,我认为调用另一个异步函数。

如果我将findSlug的返回类型更改为Future [String],我得

[error]  found   : scala.concurrent.Future[String]
[error]  required: String
[error]         case Some(user) => findSlug(base, index+1)
[error]                                    ^

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

1 个答案:

答案 0 :(得分:1)

我个人认为将返回类型设为Future[String]是正确的方法 - 这意味着你可以保持整个“反应性”,monadic,连锁期货的事情尽可能长时间(并且使用Play 2,可以一直到Controller级别 - 真棒)。

我假设你的findOne()方法只是某些Reactive Mongo查询的包装器,它会在某个时候返回Future[Option[T]]吗?

考虑到这一点,唯一真正的问题是来自两个不同Future的{​​{1}} y-ness的不同级别。

这就是我想出的。有用;这是惯用的吗?你告诉我......

case