因为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
将
自动将它们转换为您请求的类型。请注意保留HTML标签。
list collect { case s: String => s }
将从List[AnyRef]
中获取所有的String
,并返回一个包含它们的List[String]
。 - Daniel C. SobralMongoDBList
转换为可以传递到collection.find(...)
或collection.insert(...)
的MongoDBObject
? - Kevin Meredith