0

我正在使用play2-reactivemongo版本0.11.11和reactivemongo-play-json。我有以下类:如何为嵌套和引用文档创建自定义BSON读写器?

case class Player(
       id: Option[String], 
       profiles: List[Profile], 
       teams: List[Team], 
       created: Option[DateTime], 
       updated: Option[DateTime] 
       ) extends Identity 

属性profiles被表示为其中包含的Profile文档(嵌入的)元件的阵列。相反,属性teams表示值为_id的数组。但是,在处理Player实例时,我想要处理ListTeam实例,而不是_id值。因此,我认为我需要我自己的BSONReaderBSONWriter

我的代码如下:

implicit val PlayerBSONReader = new BSONDocumentReader[Player] { 
    def read(doc: BSONDocument): Player = 
     Player(
     doc.getAs[BSONObjectID]("_id") map { 
      _.stringify 
     }, 

     // attributes 'profiles', 'teams' missing 

     doc.getAs[BSONDateTime]("created").map(dt => new DateTime(dt.value)), 
     doc.getAs[BSONDateTime]("updated").map(dt => new DateTime(dt.value)) 
    ) 
    } 


implicit val PlayerBSONWriter = new BSONDocumentWriter[Player] { 
    def write(player: Player): BSONDocument = 
     BSONDocument(
     "_id" -> player.id.map(BSONObjectID(_)), 

     // attributes 'profiles', 'teams' missing 

     "created" -> player.created.map(date => BSONDateTime(date.getMillis)), 
     "updated" -> BSONDateTime(DateTime.now.getMillis) 
    ) 
    } 

我怎样才能设置属性profilesteams?在模型中查询数据库是一种不好的做法,不是吗?但是,如何在只有_id值时设置实例?

回答

0

在那里您需要确保BSONReader实例可用于任何嵌套类型(例如Profile)。

相同的要求是递归的(例如,如果Profile本身具有自定义类型作为属性)。

我认为你需要阅读更多关于类型类原则,了解它如何递归地工作,至于Play JSON Reads | Writes,或者BSON类型类。

+0

好的,谢谢,但这只回答了我的问题的一部分。我如何设置类Team'的实例列表,但只在相应的'User'文件中将它们的'_id'值存储为一个数组? –