diff --git a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoUpdate.scala b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoUpdate.scala index 66b0f5d1c..a8e240003 100644 --- a/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoUpdate.scala +++ b/mongo/jvm/src/main/scala/com/avsystem/commons/mongo/typed/MongoUpdate.scala @@ -45,9 +45,16 @@ sealed trait MongoUpdate[T] { case ArrayElementsQualifier.FirstMatching() => "$" case ArrayElementsQualifier.Each() => "$[]" case ArrayElementsQualifier.Filtered(filter) => - val name = s"filter${arrayFilters.size}" - arrayFilters.add(Bson.document(name, filter.toBson)) - s"$$[$name]" + val identifier = s"filter${arrayFilters.size}" + val (name, query) = filter match { + case MongoFilter.PropertyValueFilter(prop, propertyFilter) => + // https://www.mongodb.com/docs/manual/reference/operator/update/positional-filtered/#update-all-documents-that-match-arrayfilters-in-an-array + identifier + MongoPropertyRef.Separator + prop.rawPath -> propertyFilter + case filter => + identifier -> filter + } + arrayFilters.add(Bson.document(name, query.toBson)) + s"$$[$identifier]" } val newPath = path + MongoPropertyRef.Separator + rawQualifier diff --git a/mongo/jvm/src/test/scala/com/avsystem/commons/mongo/typed/MongoUpdateTest.scala b/mongo/jvm/src/test/scala/com/avsystem/commons/mongo/typed/MongoUpdateTest.scala index 61d9a4a7f..e5b75f9d5 100644 --- a/mongo/jvm/src/test/scala/com/avsystem/commons/mongo/typed/MongoUpdateTest.scala +++ b/mongo/jvm/src/test/scala/com/avsystem/commons/mongo/typed/MongoUpdateTest.scala @@ -68,6 +68,10 @@ class MongoUpdateTest extends AnyFunSuite { """{"$set": {"intList.$[filter0]": 5}}, [{"filter0": {"$lt": 0}}]""") assert(toString(Rte.ref(_.innerList).updateAll(_.ref(_.int).set(5))) == """{"$set": {"innerList.$[].int": 5}}, []""") + assert(toString(Rte.ref(_.innerList).updateFiltered(_.ref(_.int).lt(0), _.ref(_.int).set(5))) == + """{"$set": {"innerList.$[filter0].int": 5}}, [{"filter0.int": {"$lt": 0}}]""") + assert(toString(Rte.ref(_.innerList).updateFiltered(_.ref(_.intMap("abc")).lt(0), _.ref(_.int).set(5))) == + """{"$set": {"innerList.$[filter0].int": 5}}, [{"filter0.intMap.abc": {"$lt": 0}}]""") } test("compound updates") {