Mongodb Scala变换

Mongodb Scala变换,mongodb,scala,silhouette,Mongodb,Scala,Silhouette,我是Scala的新手,我想问一个简单的问题 我有一个返回Future[Option[T] def findOne(query: JsObject)(implicit reader: Reads[T]): Future[Option[T]] = { Logger.debug(s"Finding one: [collection=$collectionName, query=$query]") collection.find(query).one[T] } 我必须返回Future[

我是Scala的新手,我想问一个简单的问题

我有一个返回
Future[Option[T]

def findOne(query: JsObject)(implicit reader: Reads[T]): Future[Option[T]] = {
    Logger.debug(s"Finding one: [collection=$collectionName, query=$query]")
    collection.find(query).one[T]
}
我必须返回
Future[Option[PasswordInfo]]

我试过:

def find(loginInfo: LoginInfo): Future[Option[PasswordInfo]] = {

    val result = find(Json.obj("loginInfo.providerID" -> loginInfo.providerID, "loginInfo.providerKey" -> loginInfo.providerKey))

    result.onSuccess{
      case something => Future.successful(Some(something).getOrElse(None))
    }
}
我的班级:

case class PersistentPasswordInfo(
       loginInfo: LoginInfo,
       authInfo: PasswordInfo
       ) extends TemporalModel {
  override var created: Option[DateTime] = _
  override var updated: Option[DateTime] = _
  override var _id: Option[BSONObjectID] = _
}

您需要映射到未来以获取选项,然后映射到选项以获取PersistedPasswordInfo

def find(loginInfo: LoginInfo): Future[Option[PasswordInfo]] = {

    val result = find(Json.obj("loginInfo.providerID" -> loginInfo.providerID, "loginInfo.providerKey" -> loginInfo.providerKey))

    result.map(opt => opt.map(ppi => ppi.authInfo))
}
Future和Option都是functor,它们实现了一个类似于以下签名的方法映射(假设包含Future的类型arg是a):

因此,上面的代码通过应用函数选项[PersistentPasswordInfo]=>Option[PasswordInfo]来改变未来


该函数是通过在包含的选项上使用函数PersistentPasswordInfo=>PasswordInfo

Future.successful(Some(something).getOrElse(None))
创建的。
Future.successful(Some(something))
应该足够了,前提是某个东西是密码信息某个东西是持久密码信息,我需要
authInfo
它在我的类
Future.successful(Some(something.authInfo))
?它无法解析。authinfot在包含findOne函数的类上定义了什么?您可以使用u来缩短它,但我想显示在每个步骤中映射的functor。较短的版本是result.map(.map(.authInfo))谢谢。但是你能解释一下吗?如果
findOne
返回空值会发生什么?如何执行
ppi.authInfo
呢?为什么它不会返回空指针异常?(尝试访问空对象的字段)我得到
[错误]类型=>scala.concurrent.ExecutionContext[error]的对象隐式中的方法defaultContext和类型=>scala.concurrent.ExecutionContext[error]的trait ContextHelper中的方法ec都匹配预期的类型scala.concurrent.ExecutionContext[error]result.map(opt=>opt.map(ppi=>ppi.authInfo)
在实现查找的文件中尝试导入ExecutionContext.Implicits.global。处理未来的操作需要一个ExecutionContext,这是默认的ExecutionContext。很抱歉,它可以工作。这是我的导入之一。谢谢
def find(loginInfo: LoginInfo): Future[Option[PasswordInfo]] = {

    val result = find(Json.obj("loginInfo.providerID" -> loginInfo.providerID, "loginInfo.providerKey" -> loginInfo.providerKey))

    result.map(opt => opt.map(ppi => ppi.authInfo))
}