You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更新JsValue?在MongoDB更新方法中添加updatedAt字段

我来帮你搞定这个需求——给update函数加上updatedAt字段其实很简单,核心思路就是把updatedAt字段合并到要更新的JsValue里,一起通过$set提交给MongoDB。下面是具体的修改步骤和完整代码:

具体实现思路

  1. 生成updatedAt字段的JSON:用当前时间生成对应的键值对,借助你已经导入的dateTimeWriteFormat来正确序列化DateTime类型。
  2. 合并原有更新数据与updatedAt:把传入的JsValue转换为JsObject(毕竟更新操作一般都是针对对象的),再和updatedAt的JSON对象合并,这样既能保留原有更新字段,又能新增时间戳。
  3. 替换原$set的内容:把合并后的对象放到$set中,替换原来直接传入jsValue的写法。

修改后的完整代码

override def update(id: String, jsValue: JsValue): Future[Option[Person]] = {
  import utils.MongoFormats.dateTimeWriteFormat
  
  // 1. 生成updatedAt字段,用当前时间(可根据需求调整时区,比如DateTime.now(DateTimeZone.UTC))
  val updatedAtField = Json.obj("updatedAt" -> DateTime.now())
  
  // 2. 安全合并原有更新数据和updatedAt字段
  val updatedData = jsValue match {
    case obj: JsObject => obj ++ updatedAtField
    // 如果传入的不是JsObject(业务中少见情况),可根据实际需求调整处理逻辑
    case _ => Json.obj("data" -> jsValue, "updatedAt" -> DateTime.now())
  }
  
  execFindAndUpdate(
    _.findAndUpdate(
      Json.obj("xyz_ID" -> id),
      Json.obj("$set" -> updatedData), // 3. 使用合并后的完整更新数据
      fetchNewObject = true
    )
  ) map { response =>
    logger.info(s"MongoDB response: $response")
    response.result[Person]
  }
}

额外说明

  • 这里用模式匹配处理了jsValue可能不是JsObject的情况,避免直接用as[JsObject]抛出异常,让代码更健壮。如果你的业务场景中update的参数肯定是JsObject,可以简化成val updatedData = jsValue.as[JsObject] ++ updatedAtField。
  • 时间部分可以根据业务需求调整时区,比如改成UTC时间DateTime.now(DateTimeZone.UTC),确保时间戳的一致性。

内容的提问来源于stack exchange,提问作者Arun Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:18:34