我使用Play2+Scala+ReactiveMongo来构建一个web应用程序。由于mongodb
不要求所有文档具有相同的结构,因此我大量使用以Options
为参数的case类来实现模型。例如:
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
对象指定的地方有新值,在剩下的地方有旧值。
这实际上工作得很好,但是当参数列表增长时,它看起来有点难看。
有更优雅的方法吗?
如果你只在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]