我是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"}
答案 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
投放到DBObject
或exhangeCcy
投放到字符串,该怎么办?线索在getAs
。如果广告投放失败,则会返回Scala option,Some(value)
或None
。因此,读取Currency
子文档的容错方法是:
val currencyDocument = d.getAs[DBObject]("Currency") match {
case Some(v) => v
case None => throw new IllegalStateException(
"Failed to read 'Currency'")
}