如何更新JsValue?在MongoDB更新方法中添加updatedAt字段
我来帮你搞定这个需求——给update函数加上updatedAt字段其实很简单,核心思路就是把updatedAt字段合并到要更新的JsValue里,一起通过$set提交给MongoDB。下面是具体的修改步骤和完整代码:
具体实现思路
- 生成
updatedAt字段的JSON:用当前时间生成对应的键值对,借助你已经导入的dateTimeWriteFormat来正确序列化DateTime类型。 - 合并原有更新数据与
updatedAt:把传入的JsValue转换为JsObject(毕竟更新操作一般都是针对对象的),再和updatedAt的JSON对象合并,这样既能保留原有更新字段,又能新增时间戳。 - 替换原
$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
相关产品推荐
相关产品推荐

