3

MongoDB に次のようなドキュメントがあります。

{"_id":"asdf", "data":[
    {"a":"1","b":"2"}, 
    {"a":"3","b":"4"}, 
    {"a":"5","b":"6"}, 
]}

Scala を使用してそのオブジェクトにクエリを実行し、「データ」のエントリをケース クラスのリストに変換したいと考えています。数時間の作業の後、私はまだコンパイルさえできるものを思い付いていません。誰かがこの情報を含むチュートリアルを教えてもらえますか? このチュートリアルは役に立ちませんでした。ネストされたマップ、fors、foreaches、キャスト、およびパターン マッチングの可能な組み合わせをすべて試しました。

編集:私の非常に醜いが、今では一見動作するコードは次のとおりです。

def getData(source_id:String) = {
    val source = collection.findOne(MongoDBObject("_id" -> source_id)).get
    val data = source.get("data").asInstanceOf[BasicDBList]

    var ret:List[Data] = List()

    val it = presses.iterator
    while(it.hasNext) {
        val item = it.next.asInstanceOf[BasicDBObject]

        ret = Data(
            item.get("a").asInstanceOf[String],
            item.get("b").asInstanceOf[String]
        ) :: ret
    }

    ret
}

もっといい方法があると誰か教えてください。

4

1 に答える 1

1

とにかくケースクラスを使用しているため、最も簡単な解決策はsalatを使用することです。これは、非常に小さなボイラープレートで mongo 接続との間で自動的にシリアル化/逆シリアル化します。

些細な点ですが、コードでは、変数mapを手動で変更するのではなく、DBObject 保持構造を単純に横切ることができるはずです。ret

val ret = presses.map { item => Data(…) }

本当にリストが必要な場合は、.toList を呼び出す必要があるかもしれません (ただし、Seq または Iterable のみが必要な場合があります)。

于 2012-06-12T02:46:02.757 に答える