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
相关产品推荐
相关产品推荐

