7

データベースに永続化された 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 不変リストにキャストできないというクラス キャスト例外が発生します。

マップに変換するなど、さまざまな組み合わせを試しましたが、何も機能しないようです。

4

1 に答える 1

13

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 などを要求すると、それが DBListasであり、要求したタイプgetAs自動的に変換されます。

于 2011-04-25T16:17:30.833 に答える