在play框架scala中获取数据

时间:2018-02-02 05:50:00

标签: java mongodb scala playframework

我正在使用scala的play框架,我想从mongodb数据库中获取数据。如何获取/返回与令牌和get控制器相关的true / false而不是def registers(userId:String,token: String): Boolean = { val query = BSONDocument("token" -> token) val ret = Await.result(db.find(query).one[BSONDocument], 25.seconds) if(ret.isDefined){ true } else{ false } } / %d的记录。这是我模型中的代码:

%f

1 个答案:

答案 0 :(得分:2)

RobertUdah试图说的是你没有存储BSONDocument,你存储的模型最终将存储为数据库中的BSONDocument / JSONDocument。你可能想要的还不仅仅是返回一个BSONDocument而是一个特定的模型。因此,您应该考虑创建编写器和读者,以便将您的BSONDocument转换为用户(例如),反之亦然。

因此,如果您使用reactivemongo作为驱动程序,则应查看文档:{​​{3}}

这是一个从数据库中返回Person的段落。

但是如果你真的只想返回BSONDocument,那么db.find(query).one[BSONDocument]就会返回Future[Option[BSONDocument]]。因此Await.result(db.find(query).one[BSONDocument], 25.seconds)将返回Option[BSONDocument]。这意味着您的价值回报已经是您正在寻找的结果。 如果你想访问BSONDocument本身,你应该做一些模式匹配来提取它,例如:

ret match {
    case Some(document): //do something with your document
    case None: //The document was not found
}

而不仅仅是检查if (ret.isDefined)

另一方面,如果你可以避免使用Await那就更好了!您可以直接使用未来并在地图中处理结果,例如:

db.find(query).one[BSONDocument].map{
    case Some(document): //Do the thing
    case None: //The document was not found
}

这意味着地图内的代码将在未来完成后立即执行。但我真的不知道你想要做什么。

因此,根据您的代码,如果您保留Await,最终会得到类似的内容:

def registers(userId:String,token: String): Boolean = {
  val query = BSONDocument("token" -> token)
  val ret = Await.result(db.find(query).one[BSONDocument], 25.seconds)
  ret match {
    case Some(doc): //Process it
        true
    case None: //Do something else
        false
  }
}