2

我正在通过编写一个简单的应用程序来学习 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)  
}  

类别是具有 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 保存有关书籍的一些信息,例如书名、主题名称、类别等。

假设我有一个 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")))

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

或者 Casbah 不是要走的路,还有其他库可以帮助我更轻松地将其持久化到 MongoDB 中?

4

2 回答 2

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)

通常,我同时使用它们:casbah 用于查询 Mongo 和 salat 以转换为案例类,反之亦然。

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

于 2012-01-30T23:32:37.013 回答
1

我使用我自己的库子集(我最近开源了它)以及 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)
}

Subset 知道如何序列化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
  )
}

我希望你有继续的Subject想法Category

于 2012-01-31T04:43:42.893 回答