Печать вложенных документов Casbah scala

Я новичок в 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"}

person user3341078    schedule 20.02.2015    source источник


Ответы (1)


Вы можете получить доступ к поддокументу, используя 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, который имеет значение либо Some(value), либо None. если бросок не удался. Таким образом, отказоустойчивым способом чтения поддокумента Currency будет:

val currencyDocument = d.getAs[DBObject]("Currency") match {
    case Some(v) => v
    case None => throw new IllegalStateException(
        "Failed to read 'Currency'")
    }
person Pascal Bugnion    schedule 20.02.2015
comment
Без проблем. Вы можете прочитать это: stackoverflow.com/help/someone-answers. Если вы примете ответы, это повысит вероятность того, что люди будут помогать вам в будущем. - person Pascal Bugnion; 20.02.2015