From d04e76faafa966263914fe082ecf1e8e9c68654a Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 5 Jul 2024 15:23:12 +0200 Subject: [PATCH] Fix id mapping when using `$all` operator. Fix the id mapping for queries using the $all operator. Prior to this change the collection nature of the id values was not preserved leading to an invalid query. Original pull request: #4742 Closes #4736 --- .../data/mongodb/core/convert/QueryMapper.java | 2 +- .../mongodb/core/convert/QueryMapperUnitTests.java | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java index 3d27e20f3..916fe46ef 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java @@ -719,7 +719,7 @@ public class QueryMapper { for (Entry entry : valueDbo.entrySet()) { String key = entry.getKey(); - if ("$nin".equals(key) || "$in".equals(key)) { + if ("$nin".equals(key) || "$in".equals(key) || "$all".equals(key)) { List ids = new ArrayList<>(); for (Object id : (Iterable) valueDbo.get(key)) { ids.add(convertId(id, getIdTypeForField(documentField))); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java index d08f68dbd..8fe9acbe6 100755 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java @@ -1684,6 +1684,18 @@ public class QueryMapperUnitTests { assertThat(mappedObject).isEqualTo("{ 'text' : { $gt : 'gnirps', $in : [ 'atad' ] } }"); } + @Test // GH-4736 + void allOperatorShouldConvertIdCollection() { + + ObjectId oid = ObjectId.get(); + Criteria criteria = new Criteria().andOperator(where("name").isNull().and("id").all(List.of(oid.toString()))); + + org.bson.Document mappedObject = mapper.getMappedObject(criteria.getCriteriaObject(), + context.getPersistentEntity(Customer.class)); + + assertThat(mappedObject).containsEntry("$and.[0]._id.$all", List.of(oid)); + } + class WithSimpleMap { Map simpleMap; }