如何通过Casbah将带有list的scala对象转换为MongoDBObject

Fer*_*han 2 scala mongodb casbah

我正在通过编写一个简单的应用程序来学习MongoDB和Casbah.当我尝试将具有列表成员的对象转换为MongoDB对象时,卡住了.这是我的课

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)  
}  
Run Code Online (Sandbox Code Playgroud)

类别是一个具有2个案例类实现的密封特征,我打算像"Enum"一样使用它

sealed trait Category {
  def name: String
}

object Category {
  case object Computing extends Category { val name = "Computing"}
  case object Math extends Category { val name = "Math"}
}
Run Code Online (Sandbox Code Playgroud)

因此,BorrowerRecord的一个实例将保留一个人从图书馆检出的书籍,每本书都由BookTag对象识别.BookTag保存有关书籍,主题名称,类别等书籍的一些信息.

让我说我有一个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")))
Run Code Online (Sandbox Code Playgroud)

我应该如何使用Casbah将其转换为MongoDBObject?

或者卡斯巴不是可行的方式,还有其他库可以帮助我更容易地将其持久化到MongoDB中吗?

om-*_*nom 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)
Run Code Online (Sandbox Code Playgroud)

通常,我使用它们:casbah来查询/来自Mongo,以及salat来转换到case类,反之亦然.

是的,salat支持带有列表的案例类(这里是支持的集合列表).