2015-09-10 271 views
0

我期待使用Scala 2.9.x和Casbah實現我的DAO訪問層。 鑑於我的實體的情況下類參數:斯卡拉+卡斯巴對象映射的良好做法

case class Price (Id: Option[String], Price: Double, ItemName: String) 

和我的BSON文檔的樣子:

{ 
    "_id" : ObjectId("55dd1874b46f7178c8ddb737"), 
    "ItemName" : "Beet", 
    "Price" : "6" 
} 

我試圖創建一個屬性

override var prices: List[Price] = 
    db("prices").find.toList.map(
     o => Price(Some(o("_id").toString), 
     o("Price").toString.toDouble, 
     o.getAs[String]("ItemName").get)) 

這裏是我的主要關注: 1.映射字段看起來有點麻煩,應該有一些自動化。我知道我可以使用從導入net.liftweb.json。{DefaultFormats,序列化}或任何其他的解析器,但我很確定應該有更接近Casbah的東西。可能它可能是其他一些MongoDB Scala ORM。 2.我不喜歡把它放到var的想法。什麼是暴露數據的更好方式?我應該使用財產嗎? 3.什麼是entites的最佳實踐(你可以看到我使用的情況下,類參數沒有任何身體)

回答

2

我用薩拉特本:https://github.com/salat/salat/wiki/Quick-start

保存,使用asDBObject轉換一個案例類。

val testCaseClass = new TestCaseClass(null, "testName", 30, addressList) 
collection.save(grater[TestCaseClass].asDBObject(testCaseClass)) 

用於獲取,使用asObject代替

val savedCaseClass=grater[TestCaseClass].asObject(collection.findOne().get) 

這裏的案例類

class TestCaseClass(_id:ObjectId, name:String, age:Int, address:List[AddressCase]) 
+0

給了薩拉特一試的定義,現在我有一個不同的錯誤: ' case類銷售(@Key(「_ id」)Id:Option [String],Date:Date,SaleDetails:List [SaleDetail])' my json: '{ 「_id」:的ObjectId( 「55f13d293aab21313e576d34」), 「日期」: 「2015-06-24T22:22:33.875Z」, 「SaleDetails」:[{ 「ITEMNAME」: 「胡蘿蔔」 , 「價格」:1.6000000000000001, 「單位」:9 } ] }' 我想讀銷售: '覆蓋VAR銷售:列表[出售] = 分貝( 「銷售」)找到。 .toList.map( obj => 磨碎機[Sale] .asObject(obj))' 錯誤: 參數t ype不匹配 – grimcoder

+0

我總是使用類型ObjectId作爲case類的_id字段。這裏是我的testCaseClass的定義 'case class TestCaseClass(_id:ObjectId,name:String,age:Int,address:List [AddressCase])' – waterscar

+0

使用模型的ObjectId使這個類MongoDB具體哪個不好,因爲我不希望我的業務和/或UI層知道持久性的細節。 – grimcoder