diff --git a/pom.xml b/pom.xml index b6c3e7e1ab..dd9a848a6f 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.springframework.data spring-data-mongodb-parent - 4.0.0-SNAPSHOT + 4.0.0-GH-4041-SNAPSHOT pom Spring Data MongoDB diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml index c28a240d2c..b3a8e2d4eb 100644 --- a/spring-data-mongodb-benchmarks/pom.xml +++ b/spring-data-mongodb-benchmarks/pom.xml @@ -7,7 +7,7 @@ org.springframework.data spring-data-mongodb-parent - 4.0.0-SNAPSHOT + 4.0.0-GH-4041-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml index 5dedcf81ed..1ee9d3ba0b 100644 --- a/spring-data-mongodb-distribution/pom.xml +++ b/spring-data-mongodb-distribution/pom.xml @@ -15,7 +15,7 @@ org.springframework.data spring-data-mongodb-parent - 4.0.0-SNAPSHOT + 4.0.0-GH-4041-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml index b26a926c7a..6aabe08087 100644 --- a/spring-data-mongodb/pom.xml +++ b/spring-data-mongodb/pom.xml @@ -12,7 +12,7 @@ org.springframework.data spring-data-mongodb-parent - 4.0.0-SNAPSHOT + 4.0.0-GH-4041-SNAPSHOT ../pom.xml diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/UpdateMapper.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/UpdateMapper.java index 9f6d12071f..5d0a77ba27 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/UpdateMapper.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/UpdateMapper.java @@ -15,8 +15,10 @@ */ package org.springframework.data.mongodb.core.convert; +import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map.Entry; import org.bson.Document; @@ -34,6 +36,7 @@ import org.springframework.data.util.ClassTypeInformation; import org.springframework.data.util.TypeInformation; import org.springframework.lang.Nullable; +import org.springframework.util.ObjectUtils; /** * A subclass of {@link QueryMapper} that retains type information on the mongo types. @@ -209,8 +212,18 @@ private Object getMappedModifier(@Nullable Field field, Modifier modifier) { : getMappedSort(sortObject, field.getPropertyEntity()); } - TypeInformation typeHint = field == null ? ClassTypeInformation.OBJECT : field.getTypeHint(); + if (isAssociationConversionNecessary(field, value)) { + if (ObjectUtils.isArray(value) || value instanceof Collection) { + List targetPointers = new ArrayList<>(); + for (Object val : converter.getConversionService().convert(value, List.class)) { + targetPointers.add(getMappedValue(field, val)); + } + return targetPointers; + } + return super.getMappedValue(field, value); + } + TypeInformation typeHint = field == null ? ClassTypeInformation.OBJECT : field.getTypeHint(); return converter.convertToMongoType(value, typeHint); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateDocumentReferenceTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateDocumentReferenceTests.java index dde67b1148..a5398868c5 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateDocumentReferenceTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateDocumentReferenceTests.java @@ -903,6 +903,29 @@ void updateReferenceWithValue() { assertThat(target).containsEntry("toB", "b"); } + @Test // GH-4041 + void updateReferenceWithPushToCollection() { + + WithListOfRefs a = new WithListOfRefs(); + a.id = "a"; + template.save(a); + + WithListOfRefs b = new WithListOfRefs(); + b.id = "b"; + template.save(b); + + template.update(WithListOfRefs.class).matching(where("id").is(a.id)) + .apply(new Update().push("refs").each(new Object[] { b })).first(); + + String collection = template.getCollectionName(WithListOfRefs.class); + + Document target = template.execute(db -> { + return db.getCollection(collection).find(Filters.eq("_id", "a")).first(); + }); + + assertThat(target).containsEntry("refs", Collections.singletonList("b")); + } + @Test // GH-3782 void updateReferenceHavingCustomizedIdTargetType() { @@ -1584,4 +1607,11 @@ public Publisher getPublisher() { return publisher; } } + + @Data + public static class WithListOfRefs { + @Id private String id; + + @DocumentReference private List refs; + } }