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

ReactiveMongo 19.2中如何使用MongoDB数组过滤器更新文档?

ReactiveMongo 19.2 数组更新过滤器使用说明

特性支持情况

ReactiveMongo 19.2 已完整支持带标识符的更新数组过滤器特性,更新不生效是代码写法错误导致。

错误点说明

  • arrayFilters参数传递错误:update.one方法的arrayFilters参数要求直接传入过滤器数组,不需要额外包裹obj("arrayFilters" -> ...)对象,多套的外层对象会导致驱动无法识别过滤条件
  • _id查询条件写法可优化:直接传入BSONObjectId实例即可,不需要手动构造$oid结构,可避免不必要的序列化异常

正确实现代码

import org.joda.time.DateTime
import reactivemongo.play.json.collection.JSONCollection
import reactivemongo.api.bson.BSONObjectId
import reactivemongo.api.commands.WriteResult

import scala.concurrent.Future

// 假设已导入对应作用域的obj、arr构造方法
def getCollection(collName: String): Future[JSONCollection]

def updateMyArr: Future[WriteResult] = {
  // 正确构造_id查询条件
  val q = obj("_id" -> BSONObjectId("617942b33b850d6bbc490420"))
  // 更新语句保持原有逻辑即可
  val u = obj("$set" -> obj("myArr_e.$[elem].lastDate" -> DateTime.now()))
  // 直接传过滤器数组,不需要外层包裹arrayFilters对象
  val af = arr(obj("elem.name" -> "cloud"))

  for {
    coll <- getCollection("collName")
    uwr <- coll.update.one(
      q = q,
      u = u,
      upsert = false,
      multi = false,
      collation = None,
      arrayFilters = af
    )
  } yield uwr
}

结果验证

执行更新后可通过返回的WriteResult对象的nModified字段判断更新状态,值为1说明更新生效,值为0说明查询条件未匹配到对应文档。

内容的提问来源于stack exchange,提问作者jesus g_force Harris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:27:03