Scala 使用reactivemongo在mongo中查找可能的slug
我正在尝试使用Play2和reactivemongo在mongodb中查找可用的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))
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)
}
}
}