2012-01-30 50 views
2

我學習的MongoDB和卡斯巴通過編寫一個簡單的應用程序轉換與列表到MongoDBObject。當我嘗試將列表成員轉換爲MongoDB對象時遇到困難。這裏是我的類如何Scala的對象通過卡斯巴

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) 
} 

分類與2例類實現密封的特點,我打算用這個像「枚舉」

sealed trait Category { 
    def name: String 
} 

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

所以,BorrowerRecord的情況下將保持什麼書的人從圖書館中檢出,每本圖書都由BookTag對象標識。一個BookTag保持約一本書像BOOKNAME,主題名稱,類別等一些信息

比方說,我有一個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"))) 

我應該如何將它轉換爲MongoDBObject使用Casbah?

或者卡斯巴是不是要走的路還有很其他庫,可以幫助我更容易地持續到MongoDB的呢?

回答

6

要使用case類工作使用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) 

通常情況下,我使用的是他們兩個:卡斯巴從蒙戈查詢到/,和薩拉特做一個轉換,以區分類別,反之亦然。

是的,薩拉特支持使用列表case類(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