2012-01-30 6 views
2

Я изучаю MongoDB и Casbah, написав простое приложение. Застрял, когда я пытаюсь преобразовать объект со списком в объект MongoDB. Вот мой классКак преобразовать объект scala со списком в MongoDBObject через Casbah

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 сохраняет некоторую информацию о книге, как BookName, зависимое имя, категория и т.д.

Допустим, У меня есть 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 более легко?

ответ

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 для запросов к/от Монго, и намаз, чтобы сделать преобразование в случае классов и наоборот.

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

1

Я использую свою собственную библиотеку Subset (я недавно открыл его) вместе с драйвером Java MongoDB. В отличие от 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