0

我有带有反应式 mongo 插件的 Play 2.3 应用程序。我有基本文件:

trait TemporalDocument {
  val created: Option[DateTime] = Some(new DateTime())
  val updated: Option[DateTime] = Some(new DateTime())
}

和一份具体文件:

case class User(name: String) extends TemporalDocument

object User{
  implicit val userFormat = Json.format[User]
}

因此,当我使用响应式 mongo 插件将其持久化到 mongo db 时,仅保留名称,创建/更新的字段不会。

我的存储库看起来像:

trait MongoDocumentRepository[T <: TemporalDocument] extends ContextHolder {

  private val db = ReactiveMongoPlugin.db

  def insert(document: T)(implicit writer: Writes[T]): Future[String] = {
    collection.insert(document).map {
      lastError => lastError.toString
    } recover {
      case e: Exception => sys.error(e.getMessage)
    }
  }

  private def collection: JSONCollection = db.collection[JSONCollection](collectionName)

  implicit object BSONDateTimeHandler extends BSONHandler[BSONDateTime, DateTime] {
    def read(time: BSONDateTime) = new DateTime(time.value)

    def write(jdtime: DateTime) = BSONDateTime(jdtime.getMillis)
  }
}

问题是我将有许多从基础文档扩展的文档,并且我不希望每次都初始化这些日期和可能的其他一些字段。有可能做这样的事情吗?

4

1 回答 1

2

首先,我们可以将问题的表面积减半;Reactive Mongo 和/或 Play Reactive Mongo Plugin 在这里不相关,是Play 的 JSON 宏构建了相应的 JSON 结构(在这种情况下,或者不是)。

如果我在您的代码中设置了TemporalDocumentand User,然后将其写出来:

val user = User("timmy")

println(Json.toJson(user))

我得到:

{"name":"timmy"}

我还没有调查过,但我怀疑这是因为createdandupdated字段没有出现在User案例类的“字段列表”中。

如果我像这样修改你的代码:

trait TemporalDocument {
  val created: Option[DateTime]
  val updated: Option[DateTime]
}

case class User(
                name: String,
                val created: Option[DateTime] = Some(new DateTime()),
                val updated: Option[DateTime] = Some(new DateTime())) 
                extends TemporalDocument

然后相同的测试代码从 play-json 获得所需的行为:

{"name":"timmy","created":1410930805042,"updated":1410930805071}
于 2014-09-17T05:57:29.097 回答