【问题标题】:how to cast a Mongo BasicDBList to an immutable scala list如何将 Mongo BasicDBList 转换为不可变的 scala 列表
【发布时间】:2011-04-25 15:41:22
【问题描述】:

我有一个已持久化到数据库中的 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 不可变列表。

我尝试了各种组合,例如转换为地图等。似乎没有任何效果。

【问题讨论】:

    标签: scala mongodb casbah


    【解决方案1】:

    因为 MongoDB 以与 JavaScript 相同的方式存储数组 --- 作为具有指示其索引的整数键的对象 --- BasicDBList 在内部是必需的,以表示从网络中出来的对象。因此,目前 Casbah 不会自动将其表示为 Scala 列表.... BasicDBList 是 HashMap,而不是 List。

    但是,Casbah 内部确实提供了隐式转换,让您将 BasicDBList 视为 LinearSeq[AnyRef]; LinearSeq 在类型树上与 List 有点不同,但出于各种原因,它是一种更合适的类型。不幸的是,您不能 cast 使用隐式转换。

    现在,我建议您将项目作为 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]: TgetAs[T]: Option[T] 方法比强制转换更可取,因为它们内部有一些技巧来进行类型按摩。 Casbah 的下一个版本将包含代码,因此如果您要求 Seq、List 等并且它是 DBList asgetAs自动将它们转换为您要求的类型。

    【讨论】:

    • 感谢您的回复。我也尝试过这种方法。但是,我无法弄清楚如何将 List[AnyRef] 转换为 List[String],因为我希望将结果作为字符串列表。可能很简单,但不确定如何。
    • @venividivamos list collect { case s: String => s } 将从List[AnyRef] 中获取所有String 并返回List[String]
    • 是的,@DCSobrals 的答案是最好的选择。因为您不能在 MongoDB 中“键入”集合,所以无法保证在遍历集合时内容是特定类型的。收集它们将是最安全的。事实上,我将在下一个版本中窃取这种方法,以“尝试”将集合全部转换为给定类型。
    • @Daniel 正是我想要的。非常感谢。
    • 从 2.1.5.0 起这仍然有效吗?我收到一个编译错误“值 toList 不是 com.mongodb.BasicDBList 的成员”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    相关资源
    最近更新 更多