【问题标题】:Scala and Casbah - error: Option[com.mongodb.DBObject] does not take parametersScala 和 Casbah - 错误:Option[com.mongodb.DBObject] 不带参数
【发布时间】:2013-02-17 10:14:04
【问题描述】:

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

【问题讨论】:

  • Why Option[T] ? 的可能重复项
  • 简而言之:如果你 100% 确定你有一个值,则使用 .get 方法,如果你不确定,则使用 .getOrElse(*somedefault*),但希望提供默认值以防数据库返回任何内容。您还可以使用 .map 来转换选项。

标签: scala casbah


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2014-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多