Scala和Casbah - 错误:选项[com.mongodb.DBObject]不接受参数

时间:2013-02-17 10:14:05

标签: scala casbah

我正在尝试获取doc并获取它的属性。当我使用findOne方法时,我希望得到MongoDBObject,但我收到Option [com.mongodb.DBObject]。如何从中获取属性?是否有可能获得MongoDBObject而不是这个?

scala> var col = MongoClient()("test")("counters")
col: com.mongodb.casbah.MongoCollection = MongoCollection({ "_id" : "some" , "value" : 0})

scala> var doc = col.findOne()
doc: Option[com.mongodb.DBObject] = Some({ "_id" : "some" , "value" : 0})

scala> doc("_id")
<console>:13: error: Option[com.mongodb.DBObject] does not take parameters
              doc("_id")
                 ^
scala>

3 个答案:

答案 0 :(得分:2)

Casbah API并不知道您的数据库的内容,也不能确定您要求的记录是否真的存在。在Java中,这种方法只返回可以是null的对象。在Scala中不鼓励使用更安全的Option[T]类型。这样你就不得不处理对象不存在的情况。你有几种语法(从最差到最好:

当您确定对象存在时 - 否则将抛出异常

col.findOne().get

当你想处理两种情况时:

col.findOne() match {
  case Some(r) => //r is your record
  case None => //record didn't exist
}

如果要对记录执行某些操作(monadic style)

col.findOne().map(r => r("_id")).foreach(println)

上面的代码只会在找到此类记录时打印_id列,否则不会执行任何操作。

答案 1 :(得分:1)

您获得了一个Option [DBObject],因为您尝试查找的对象可能不在数据库中。

您可以使用match构造处理它:

col.findOne() match{
  case Some(doc) => doc("id")
  case None => // not found
}

答案 2 :(得分:1)

你得到一个Option[DBObject],因为可能没有找到,一般你想避免在scala(和任何其他函数语言)中返回null。有几种方法可以对结果采取行动。要简单地获得结果,如果从查询中获得get,则可以调用None,这将引发异常。然后有getOrElse,您可以使用它来获取您必须传递给调用的结果或默认值。然后有orNull,它返回结果或null,如果没有则返回null。您也可以使用foreach,如果您只使用结果来创建副作用,或map,如果您想获得某个值,然后例如在结果选项上调用getOrElse