Поскольку 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
будут автоматически преобразовывать их в требуемый тип.
person
Brendan W. McAdams
schedule
25.04.2011