나는 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
)
내가 albumId
album
로 대체 할 :
다음 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))
}
'읽기'는 읽기 이외의 다른 작업을 수행해서는 안됩니다. 나는 그것이 디자인 결함의 힌트라고 말할 것이다. – cchantep