7

では、CasbahとMongoDBの基本に関する別の質問があります。データベースからDBObjectを取得した後、特定のデータをデータベースから抽出するにはどうすればよいですか?DBObject.get()を返すメソッドがあることを私は知っていますjava.lang.Object。このようにして、必要なタイプにデータをキャストする必要がありますか?これが最善の方法かどうかはわかりません...これをより適切に行う方法について誰かが推奨できますか?

アップデート:

最後に、私はすべてのものを手動で処理する方法を取りました。ケースクラスは子供を持つことには推奨されておらず、アーキテクチャの再配置が必要になるため、ケースクラスの制限のためにSalatを使用していません。ただし、ほとんどの状況で機能し、他に一般的な回答がないため、回答は最良の回答としてマークされます。

4

2 に答える 2

11

MongoDBObjectのasメソッドを使用して、値を取得し、1回の呼び出しでキャストできます。

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..

as指定されたキーが見つからない場合は例外をスローすることに注意してください。getAsあなたはあなたに与える使用することができますOption[A]

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

リストの抽出はもう少し複雑です。

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

私は、casbahの使用をより考慮に入れるヘルパーを作成しましたが、それが役立つかもしれないので、それを添付します。

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"

お役に立てば幸いです。

于 2012-06-26T03:41:18.940 に答える
2

追加の依存関係を使用することを恐れていない場合は、Salatを使用してください。Salatを使用すると、ケースクラスをデータベースオブジェクトにキャストしたり、元に戻したりするのは非常に簡単です。

シリアル化

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

デシリアライズ

val company_* = grater[Company].asObject(dbo)
于 2012-05-06T11:33:21.730 に答える