как преобразовать Mongo BasicDBList в неизменный список Scala - PullRequest
7 голосов
/ 25 апреля 2011

У меня есть BasicDBList, который был сохранен в базе данных. Я сейчас читаю данные и пытаюсь преобразовать список в неизменный список scala, как показано:

val collection = mongoFactory.getCollection("tokens")    
val appId = MongoDBObject("appId" -> id)
val appDBObject = collection.findOne(appId) 
val scope: List[String] = appDBObject.get("scope").asInstanceOf[List[String]]

Однако я получаю исключение приведения класса, говорящее, что невозможно привести BasicDBList в неизменяемый список Scala.

Я пробовал различные комбинации, такие как преобразование в карту и т. Д. Кажется, ничего не работает.

1 Ответ

13 голосов
/ 25 апреля 2011

Поскольку 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, то автоматически преобразует их в тип, который вы запрашивали.

...