在玩!应用程序基础文档字段不会持久化到mongo db(reactive mongo plugin)

时间:2014-09-13 18:38:00

标签: mongodb playframework playframework-2.3 reactivemongo play-reactivemongo

我有使用反应式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)
  }
}

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

1 个答案:

答案 0 :(得分:2)

首先,我们可以将问题的表面区域减半; Reactive Mongo和/或Play Reactive Mongo插件在这里不相关,它是Play's JSON macros构建适当的JSON结构(在这种情况下,不是,在这种情况下)负责。

如果我在代码中设置TemporalDocumentUser,然后将其写出来:

val user = User("timmy")

println(Json.toJson(user))

我明白了:

{"name":"timmy"}

我没有调查过,但我怀疑这是因为createdupdated字段没有出现在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}