Поскольку MongoDB хранит массивы так же, как это делает JavaScript - как объект с целочисленными ключами, указывающими их индекс - BasicDBList необходим для представления объекта, выходящего из сети. Таким образом, в настоящее время Casbah не представляет его автоматически в виде списка Scala ... BasicDBList - это HashMap, а не список.
ОДНАКО, внутренне Casbah предоставляет неявные преобразования, чтобы позволить вам рассматривать BasicDBList как LinearSeq [AnyRef]; LinearSeq немного отличается от дерева типов, чем List, но более подходит для разных причин. К сожалению, вы не можете привести к неявным преобразованиям.
На данный момент я рекомендую вам получить элемент в виде DBList, а затем либо аннотировать его как LinearSeq, который будет использовать неявный, либо просто вызвать toList для него (неявный предоставит метод toList).
scala> val l = MongoDBList("foo", "bar", "baz")
l: com.mongodb.BasicDBList = [ "foo" , "bar" , "baz"]
scala> val obj = MongoDBObject("list" -> l)
obj: com.mongodb.casbah.commons.Imports.DBObject = { "list" : [ "foo" , "bar" , "baz"]}
scala> obj.as[BasicDBList]("list")
res8: com.mongodb.casbah.Imports.BasicDBList = [ "foo" , "bar" , "baz"]
scala> obj.as[BasicDBList]("list").toList
res9: List[AnyRef] = List(foo, bar, baz)
Методы as[T]: T
и getAs[T]: Option[T]
, кстати, предпочтительнее, чем приведение типов, так как они имеют некоторую хитрость для выполнения массива типов. Следующая версия Casbah будет включать код, так что если вы запросите Seq, List и т. Д., И это DBList as
и getAs
, то автоматически преобразует их в тип, который вы запрашивали.