2012-01-30 5 views
2

私はMongoDBとCasbahを簡単なアプリケーションを書くことで学んでいます。リストメンバを持つオブジェクトをMongoDBオブジェクトに変換しようとすると、固まってしまいました。ここに私のクラスがあるリストを持つスカラオブジェクトをCasbah経由でMongoDBObjectに変換する方法

case class BorrowerRecord(name: String, checkedOut: List[BookTag]) { 
    require(!name.isEmpty) 
    require(!checkedOut.isEmpty) 
} 

case class BookTag (subject: Subject, bookName: String) { 
    require(!bookName.isEmpty) 
} 

case class Subject (name: String, category: Category) { 
    require(!name.isEmpty) 
} 

カテゴリーだから、BorrowerRecordのインスタンスが何冊人続ける

sealed trait Category { 
    def name: String 
} 

object Category { 
    case object Computing extends Category { val name = "Computing"} 
    case object Math extends Category { val name = "Math"} 
} 

私は「列挙型」のようにこれを使用することを意図し、2ケースクラスの実装と密封された形質でありますライブラリからチェックアウトされた場合、各ブックはBookTagオブジェクトによって識別されます。 BookTagは、どのように私はMongoDBObjectにこれを変換する必要があり

は私がBorrowerRecordてきたと言うとMongoDBの

val borrowOnToday = BorrowerRecord("My Name", List(BookTag(Subject("J2EE", Category.Computing), "Head First Java"), 
                BookTag(Subject("Linear Algebra", Category.Math), "Algebra for Dummies"))) 

にそれを保存することができますなどbooknameのような書籍、サブジェクト名、カテゴリー、に関するいくつかの情報を保持しますカスバを使って?

またはCasbahは行く方法ではありません。これをMongoDBに保存しやすくするためのライブラリがありますか?

答えて

6

ケースクラスで作業するには、salatを使用してください(< - および - >を押してプレゼンテーションを移動してください)。

それは非常に単純です:

case class Alpha(x: String) 

scala> val a = Alpha(x = "Hello world") 
a: com.novus.salat.test.model.Alpha = Alpha(Hello world) 

scala> val dbo = grater[Alpha].asDBObject(a) 
dbo: com.mongodb.casbah.Imports.DBObject = { "_typeHint" : 
    "com.novus.salat.test.model.Alpha" , "x" : "Hello world"} 

scala> val a_* = grater[Alpha].asObject(dbo) 
a_*: com.novus.salat.test.model.Alpha = Alpha(Hello world) 

通常、私はそれらの両方を使用しています:モンゴから/への照会へのカスバ、およびクラスとその逆のケースへの変換を行うためにサラッと。

そして、はい、salatはリストでケースクラスをサポートしています(hereはサポートされているコレクションです)。

1

私は自分自身のライブラリSubset(私は最近オープンソース化しています)とMongoDB Javaドライバを使用しています。 Salatとは異なり、明示的にすべてのシリアライゼーションコードを宣言する必要がありますが、Subsetを使用するとシンプルなコードにすることができます。あなたはボーナスとしてクエリを作成する能力を得るでしょう。データモデルについては

、コードが

object BorrowerRecord { 
    val name = "name".fieldOf[String] 
    val checkedOut = "cout".fieldOf[List[BookTag]] 

    def toDBO(rec: BorrowerRecord): DBObject = 
    name(rec.name) ~ checkedOut(rec.checkedOut) 
} 

のように見えるかもしれサブセットはList[T]をシリアル化する方法を知っているが、それはそのための暗黙のValueWriter[BookTag]を必要とします:

object BookTag { 
    val subject = "subj".fieldOf[Subject] 
    val name = "name".fieldOf[String] 

    implicit def writer = ValueWriter[BookTag](bt => 
    (subject(bt.subject) ~ name(bt.name)).get 
) 
} 

私はあなたのアイデアを得た願っています続行するにはSubjectCategory

関連する問題