Casbah scala嵌套文档打印

时间:2015-02-20 08:03:22

标签: scala casbah

我是Casbah和scala的新手。如何在scala中访问嵌套文档?我在这里定义的字段很少,你可以看到货币和比率是嵌套文件。当我尝试打印Currency.ExchangeCCY时,它给了我一个错误。我怎样才能获得特定的值而不是整个嵌套对象?

val query = MongoDBObject("RunDate" -> "18-02-2015")                      
val fields = MongoDBObject("Currency.ExchangeCCY" -> 1,         
                           "Currency.MarketCapCCY" -> 1)

for (d <- price.find(query,fields))  println(d("Currency"))
//> { "ExchangeCCY" : "CAD" , "MarketCapCCY" : "CAD"}
//| { "ExchangeCCY" : "CAD" , "MarketCapCCY" : "CAD"}

1 个答案:

答案 0 :(得分:2)

您可以使用d.getAs[DBObject]d.getAsOrElse[DBObject]访问子文档。这将返回另一个DBObject,您可以从中查询特定字段。

在您的情况下,暂时忽略错误处理,

val currencyDocument = d.getAs[DBObject]("Currency").get
val exchangeCcy = currencyDocument("ExchangeCCY")

这种方法存在一些问题。最明显的是exchangeCcy的编译时类型。如果您查看Casbah Scaladocs,就会看到它的类型为AnyRef。如果您认为这应该始终是一个字符串,您可以通过以下方式强制执行:

val exchangeCcy = currencyDocument.getAs[String]("ExchangeCCY").get

exhangeCcy现在保证是一个字符串。

错误处理怎么样?如果我们无法将Currency投放到DBObjectexhangeCcy投放到字符串,该怎么办?线索在getAs。如果广告投放失败,则会返回Scala optionSome(value)None。因此,读取Currency子文档的容错方法是:

val currencyDocument = d.getAs[DBObject]("Currency") match {
    case Some(v) => v
    case None => throw new IllegalStateException(
        "Failed to read 'Currency'")
    }