我正在尝试获取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>
答案 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
}
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