2017-02-10 18 views
0

У меня есть класс Song и класс Album. Моя цель состоит в том, чтобы иметь две отдельные коллекции и хранить ссылку через BSONObjectID в базе данных, но в моем коде я хочу сопоставить эти идентификаторы с их соответствующими объектами.Как создать пользовательский сценарий/считыватель, который запрашивает БД?

Вот моя текущая модель:

case class Song(var _id: Option[BSONObjectID] = None, 
        name: String, 
        albumId: BSONObjectID, 
        var created: Option[DateTime] = None, 
        var updated: Option[DateTime] = None 
       ) 

И я хочу, чтобы заменить albumId с album:

Вот моя текущая модель:

case class Song(var _id: Option[BSONObjectID] = None, 
        name: String, 
        album: Album, 
        var created: Option[DateTime] = None, 
        var updated: Option[DateTime] = None 
       ) 

Как documentation состояний, я должен создать для этого пользовательский писатель/читатель. Тем не менее, моя проблема заключается в том, что я не знаю, как я могу запросить внутри моей пользовательской программы чтения/записи базы данных, чтобы получить все необходимые поля для создания экземпляра моего Album. Так ли это должно работать? Запрос базы данных в модели?

object Song { 

    import play.api.libs.json._ 
    import play.api.libs.json.Reads._ 
    import play.api.libs.functional.syntax._ 
    import reactivemongo.play.json.BSONFormats.BSONObjectIDFormat 

    implicit val songReads: Reads[Song] = (
    (__ \ "_id").readNullable[BSONObjectID].map(_.getOrElse(BSONObjectID.generate)).map(Some(_)) and 
     (__ \ "album").read[BSONObjectID].map(x => Album(_id = Option(_), ...)) and // ??? 
     (__ \ "created").readNullable[DateTime].map(_.getOrElse(new DateTime())).map(Some(_)) and 
     (__ \ "updated").readNullable[DateTime].map(_.getOrElse(new DateTime())).map(Some(_)) 
    ) (Song.apply _) 

    implicit val songWrites: OWrites[Song] = (
    (__ \ "_id").writeNullable[BSONObjectID] and 
     (__ \ "album").write[BSONObjectID] and // ??? 
     (__ \ "created").writeNullable[DateTime] and 
     (__ \ "updated").writeNullable[DateTime] 
    ) (unlift(Song.unapply)) 

} 
+0

«Читает» не должно выполнять никаких действий, кроме чтения. Я бы сказал, что это намек на недостаток дизайна. – cchantep

ответ

0

Как кто-то обсуждали, BSONHandlers в ReactiveMongo несут ответственность за сериализации/десериализации одного объекта, а не управлять объектные отношения.

Управление отношениями не имеет особого отношения к сериализации, и вам нужно написать отдельный слой для его обработки.

def loadSong(songName:String) : Future[Song] = // query coll 1 then query coll2 then build Song object