scala - 如何将 Mongo BasicDBList 转换为不可变的 scala 列表

标签 scala mongodb casbah

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

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

最佳答案

因为 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自动将它们转换为您要求的类型。

关于scala - 如何将 Mongo BasicDBList 转换为不可变的 scala 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5780079/

相关文章:

scala - 在 Spark SQL 中将多个小表与一个大表连接起来的最佳方法

scala - 使用两个条件过滤列表并创建 map scala

Scala 替代无限循环

scala - 状态 monad - 调整仅适用于部分状态的功能?

MongoDB:分页导致重复的奇怪排序行为

Node.js MongoDB Find 与投影以排除 _id 仍然返回它

node.js - 如果记录不存在,MongoDB 查找不会返回错误?

mongodb - Mongo Shell 显示已添加文档,但 Scalatest 中断言失败

scala - 使用 Casbah 通过正则表达式查找

mongodb - 使用 Casbah 将 lift-json JValue 转换为 MongoDBObject?