Play2 Scala模型 - 合并对象

时间:2015-09-23 08:16:31

标签: scala playframework-2.0 reactivemongo

我正在使用Play2 + Scala + ReactiveMongo来构建Web应用程序。由于mongodb不要求所有文档具有相同的结构,因此我大量使用带有Options的案例类作为参数来实现模型。例如:

case class PersonInfo(address: Option[String],
                      telephone: Option[String],
                      age: Option[Int],
                      job: Option[String])
case class Person(id: UUID, name: String, info: PersonInfo)

现在假设我要合并两个PersonInfo对象,例如在更新函数中。我现在做的是:

val updPInfo = old.copy(address = new.address orElse address,
                        telephone = new.telephone orElse telephone,
                        age = new.age orElse age,
                        job = new.job orElse job)

这样我就有了一个对象,它具有new对象指定的新值和剩余值的旧值。

这实际上工作正常,但是当参数列表增长时,看起来有点难看。

有更优雅的方法吗?

1 个答案:

答案 0 :(得分:0)

如果您需要的唯一地方是mongo,您可以这样做:

collection.
      update(
          Json.obj("_id" -> id),
          Json.obj("$set" -> Json.toJson(new))
      )

通过这种方式,您可以在DB中进行正确的演示,然后您可以阅读并使用它。

如果您在Scala中需要它,您可以合并2个Json演示文稿:

val merged = Json.toJson(old).deepMerge(new).as[PersonInfo]

哪个不太好,那你现在在做什么。