0

我正在使用play2-reactivemongo版本 0.11.11 和reactivemongo-play-json. 我有以下课程:

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我想处理List实例Team而不是_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

4

1 回答 1

0

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

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

我认为您需要阅读有关类型类原理的更多信息,以了解它如何递归工作,如 Play JSON Reads| Writes,或用于 BSON 类型类。

于 2016-05-29T20:30:38.267 回答