因为 MongoDB 以与 JavaScript 相同的方式存储数组 --- 作为具有指示其索引的整数键的对象 --- BasicDBList 在内部是必需的,以表示从网络中出来的对象。因此,目前 Casbah 不会自动将其表示为 Scala 列表...... BasicDBList 是 HashMap,而不是 List。
但是,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
会自动将它们转换为您要求的类型。