Как преобразовать объект Scala со списком в MongoDBObject через Casbah - PullRequest
2 голосов
/ 31 января 2012

Я изучаю 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-х классов, я намеревался использовать это как "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"}
}

Итак, экземпляр 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")))

Как следуетпреобразовать это в MongoDBObject с помощью Casbah?

Или Casbah - не тот путь, и есть другие библиотеки, которые могут помочь мне легче перенести это в MongoDB?

Ответы [ 2 ]

6 голосов
/ 31 января 2012

Для работы с классами дел используйте 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 для преобразования в case-классы и наоборот.

И да, salat поддерживает классы дел со списками ( здесь - список поддерживаемых коллекций).

1 голос
/ 31 января 2012

Я использую свою собственную библиотеку Подмножество (я недавно ее открыл) вместе с драйвером 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
  )
}

Я надеюсь, у вас есть идея продолжить с Subject и Category

...