2015-09-10 149 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