2

我正在尝试获取文档并获取它的属性。当我使用 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>
4

3 回答 3

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列 - 否则不执行任何操作。

于 2013-02-17T10:23:13.523 回答
1

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

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

col.findOne() match{
  case Some(doc) => doc("id")
  case None => // not found
}
于 2013-02-17T10:20:11.343 回答
1

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

于 2013-02-17T10:20:24.917 回答