2017-02-10 12 views
0

나는 Song 클래스와 Album 클래스를 가지고 있습니다. 내 목표는 두 개의 별도의 컬렉션을 가지고 데이터베이스에 BSONObjectID을 통해 참조를 유지하지만, 내 코드에서이 각각의 엔터티에이 ID를 매핑하려고합니다.DB를 쿼리하는 사용자 지정 기록기/판독기를 만드는 방법은 무엇입니까?

가 여기 내 현재의 모델이다 :

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

내가 albumIdalbum로 대체 할 :

여기 내 현재 모델의

다음 documentation 상태로

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

, 나는 만들어야합니다 그걸위한 커스텀 작가/독자. 그러나 내 문제는 내 사용자 지정 판독기/작성기 내부에서 내 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

는 ReactiveMongo에서 BSONHandlers 객체 관계를 관리 할 수없는, 하나의 객체를 역 직렬화/직렬화에 대한 책임이 있습니다.

관리 관계는 직렬화와 관련이 없으므로이를 처리하기 위해 별도의 레이어를 작성해야합니다.

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