2012-05-06 11 views
7

これで、CasbahとMongoDBの基本についての別の質問があります。データベースからDBObjectを取得したら、そこから特定のデータをどのように抽出するのですか?私は、メソッドがあり、それはjava.lang.Objectを返すことを知っています。このようにして、データを必要なタイプにキャストする必要がありますか?私はこれが最良の方法だとは確信していません...誰もがこれをより良くする方法をお勧めできますか?Casbah Scala MongoDBドライバ - DBObjectからデータを取得する

UPDATE:

最後に、私は手動ですべてのものを処理する方法を行ってきました。私はSalatを使用していません。なぜなら、ケースクラスは子供を持つために推奨されておらず、それはアーキテクチャの再構成を必要とするからです。しかし、答えは最も良い答えとしてマークされています。なぜなら、ほとんどの状況でうまくいくので、ここでは一般的な答えは他にありません。

答えて

11

指定されたキーが見つかりません。リストを抽出

obj.getAs[String]("title") match { 
    case Some(someStr) => ... 
    case None => ... 
} 

少し複雑です:あなたはあなたのOption[A]を与えるgetAsを使用することができ

val myListOfInts = 
    (List() ++ obj("nums").asInstanceOf[BasicDBList]) map { _.asInstanceOf[Int] } 

私はカスバよりconsiceを使用して作るヘルパーを、書いて、それが参考になるかもしれ私はそれを添付:

package utils 

import com.mongodb.casbah.Imports._ 

class DBObjectHelper(underlying: DBObject) { 

    def asString(key: String) = underlying.as[String](key) 

    def asDouble(key: String) = underlying.as[Double](key) 

    def asInt(key: String) = underlying.as[Int](key) 

    def asList[A](key: String) = 
    (List() ++ underlying(key).asInstanceOf[BasicDBList]) map { _.asInstanceOf[A] } 

    def asDoubleList(key: String) = asList[Double](key) 
} 

object DBObjectHelper { 

    implicit def toDBObjectHelper(obj: DBObject) = new DBObjectHelper(obj) 

} 

あなたはこのようにヘルパーを使用することができます。

val someStr = obj asString "title" 
val someInt = obj asInt "count" 
val myDoubleList = obj asDoubleList "coords" 

私はそれがあなたを助けてくれることを願っています。

+0

非常にうまくトピックをカバーするうわー!ありがとう、これは明らかに今最良の答えとして選択されています。 – noncom

+0

'val obj = coll.findOne(query);を呼び出すとき、' getAsはOption [coll.T]のメンバではありません。 val str = obj.getAs [String]( "myValue") '。 –

+0

この例は機能しませんが、 'findOne'は' Option'型を返します。 – andyczerwonka

2

追加の依存関係を使用することを恐れていない場合は、Salatを使用してください。 Salatを使用すると、ケースクラスをデータベースオブジェクトにキャストして戻すことが本当に簡単です。 asがあれば例外をスローすることを

val coll = MongoConnection()(dbName)(collName) 
val query = MongoDBObject("title" -> "some value") 
val obj = coll findOne query 

val someStr = obj.as[String]("title") 
val someInt = obj.as[Int]("count") 
// and so on.. 

注:値を取得し、1回の呼び出しでそれをキャストするMongoDBObjectのasメソッドを使用することができます

シリアライズ

val dbo = grater[Company].asDBObject(company) 

、デシリアライゼーション

val company_* = grater[Company].asObject(dbo) 
+0

ええ、私はSalatについて知っています...依存関係の使用を恐れることはありませんが、いくつかの問題はcase-class only requriementによって提示される可能性があります。他に意味のある答えがなければ、私はSalatを調べなければならないでしょう...しかし、ケースクラスはアーキテクチャを変える必要があります。 – noncom

+0

Scala 2.10では動作しません – expert

関連する問題