如何更新 JsValue?

How to update JsValue?

JsValue 是一个 trait。它可能是任何东西的对象。 JsArrayJsObject 等给定一个函数 Ex.

override def update(Id: String, jsValue: JsValue): Future[Option[Person]] = {
import utils.MongoFormats.dateTimeWriteFormat
execFindAndUpdate(
  _.findAndUpdate(
    Json.obj("xyz_ID" -> id),
    Json.obj("$set" -> jsValue),
    fetchNewObject = true
  )
) map { response =>
  logger.info(s"MongoDB response: $response")
  response.result[Person]
}
}

我想在写入 mongoDB 时添加 updatedAt。简而言之,我想更新 jsValue。 我试过

Json.obj("$set" -> jsValue, "$set" -> Json.obj("updatedAt" -> Json.toJson(new DateTime())))

但是失败了。

仅供参考,我正在使用 scala 2.6.xreactiveMongo 版本 0.12.7-play26 有人可以帮我解决这个问题吗?

但是你知道只有拥有JsObject才能更新。对于其他情况,这将毫无意义,对吗?所以解决方案是只在这种情况下检查和更新:

override def update(Id: String, jsValue: JsValue): Future[Option[Person]] = {
  import utils.MongoFormats.dateTimeWriteFormat
  execFindAndUpdate(
    _.findAndUpdate(
      Json.obj("xyz_ID" -> id),
      Json.obj("$set" -> (jsValue match {
        case o: JsObject => o + ("updatedAt" -> Json.toJson(new DateTime()))
        case o => o
      })),
      fetchNewObject = true
    )
  ) map { response =>
    logger.info(s"MongoDB response: $response")
    response.result[Person]
  }
}