Casbah Scala MongoDB驱动程序-从DBObject获取数据

Casbah Scala MongoDB驱动程序-从DBObject获取数据,mongodb,casbah,Mongodb,Casbah,好的,这里还有一个关于Casbah和MongoDB基础知识的问题。从数据库中检索到DBObject后,如何从中提取某些数据?我知道有一个DBObject.get()方法,它返回java.lang.Object。我必须这样做,然后将数据转换为所需的类型吗?我不确定这是否是最好的方法。。。有人能推荐如何做得更好吗 更新: 最后,我开始手动处理所有的东西。我之所以不使用Salat,是因为case类的限制,因为不建议使用case类生孩子,这需要重新安排架构。但是,答案被标记为最佳答案,因为它在大多数情况

好的,这里还有一个关于Casbah和MongoDB基础知识的问题。从数据库中检索到DBObject后,如何从中提取某些数据?我知道有一个
DBObject.get()
方法,它返回
java.lang.Object
。我必须这样做,然后将数据转换为所需的类型吗?我不确定这是否是最好的方法。。。有人能推荐如何做得更好吗

更新:


最后,我开始手动处理所有的东西。我之所以不使用Salat,是因为case类的限制,因为不建议使用case类生孩子,这需要重新安排架构。但是,答案被标记为最佳答案,因为它在大多数情况下都适用,这里没有其他更一般的答案。

如果您不怕使用其他依赖项,请使用。使用Salat,将case类转换到数据库对象并返回非常简单

系列化

val dbo = grater[Company].asDBObject(company)
val company_* = grater[Company].asObject(dbo)
反序列化

val dbo = grater[Company].asDBObject(company)
val company_* = grater[Company].asObject(dbo)

您可以使用MongoDBObject的
as
方法获取值并在一次调用中强制转换它:

val coll = MongoConnection()(dbName)(collName)
val query = MongoDBObject("title" -> "some value")
val obj = coll findOne query

val someStr = obj.as[String]("title")
val someInt = obj.as[Int]("count")
// and so on..
请注意,如果找不到给定的键,
as
将引发异常。您可以使用
getAs
,它为您提供了
选项[A]

obj.getAs[String]("title") match {
    case Some(someStr) => ...
    case None => ...
}
提取列表有点复杂:

val myListOfInts =
  (List() ++ obj("nums").asInstanceOf[BasicDBList]) map { _.asInstanceOf[Int] }
我写了一个助手,这使得使用casbah更加一致,可能会有帮助,因此我附上它:

package utils

import com.mongodb.casbah.Imports._

class DBObjectHelper(underlying: DBObject) {

  def asString(key: String) = underlying.as[String](key)

  def asDouble(key: String) = underlying.as[Double](key)

  def asInt(key: String) = underlying.as[Int](key)

  def asList[A](key: String) =
    (List() ++ underlying(key).asInstanceOf[BasicDBList]) map { _.asInstanceOf[A] }

  def asDoubleList(key: String) = asList[Double](key)
}

object DBObjectHelper {

  implicit def toDBObjectHelper(obj: DBObject) = new DBObjectHelper(obj)

}
您可以像这样使用帮助器:

val someStr = obj asString "title"
val someInt = obj asInt "count"
val myDoubleList = obj asDoubleList "coords"

我希望它能帮助你。

是的,我知道沙拉。。。不害怕使用依赖项,但是case-class-only需求可能会带来一些麻烦。如果没有其他有意义的答案,我将不得不调查萨拉特然后。。。但是案例类可能需要改变架构。哇,这很好地涵盖了这个主题!谢谢,这显然是现在选择的最佳答案。当调用
val obj=coll.findOne(查询)时,我得到
value getAs不是Option[coll.T]
的成员;val str=obj.getAs[String](“myValue”)
。该示例不起作用,
findOne
返回一个
选项
类型。