From 8115316bea32ddcdbecdfe5f3d7f2f27936b4274 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 5 May 2025 09:34:00 +0200 Subject: [PATCH] Fix SetOperation.toValueOf rendering for field references. Use single field reference instead of invalid multi field. See: #4933 --- .../mongodb/core/aggregation/SetOperation.java | 2 +- .../AddFieldsOperationUnitTests.java | 3 +-- .../core/aggregation/SetOperationUnitTests.java | 17 ++++++++++++++++- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/SetOperation.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/SetOperation.java index 7f5c1c772..b188b16b5 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/SetOperation.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/SetOperation.java @@ -140,7 +140,7 @@ public class SetOperation extends DocumentEnhancingOperation { @Override public SetOperation toValueOf(Object value) { - valueMap.put(field, value instanceof String stringValue ? Fields.fields(stringValue) : value); + valueMap.put(field, value instanceof String stringValue ? Fields.field(stringValue) : value); return FieldAppender.this.build(); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AddFieldsOperationUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AddFieldsOperationUnitTests.java index 39437fc7a..8dcf96231 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AddFieldsOperationUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/AddFieldsOperationUnitTests.java @@ -128,7 +128,7 @@ class AddFieldsOperationUnitTests { assertThat(fields.getField("does-not-exist")).isNull(); } - @Test // DATAMONGO-4933 + @Test // GH-4933 void rendersStringValueAsFieldReferenceCorrectly() { AddFieldsOperation operation = AddFieldsOperation.builder().addField("name").withValueOf("value").build(); @@ -143,7 +143,6 @@ class AddFieldsOperationUnitTests { .containsExactly(Document.parse("{\"$addFields\" : {\"totalHomework\":\"$home_work\"}}")); } - private static AggregationOperationContext contextFor(@Nullable Class type) { if (type == null) { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/SetOperationUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/SetOperationUnitTests.java index 093d4af7a..d6f95216a 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/SetOperationUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/aggregation/SetOperationUnitTests.java @@ -21,7 +21,6 @@ import java.util.List; import org.bson.Document; import org.junit.jupiter.api.Test; - import org.springframework.data.mongodb.core.convert.MappingMongoConverter; import org.springframework.data.mongodb.core.convert.NoOpDbRefResolver; import org.springframework.data.mongodb.core.convert.QueryMapper; @@ -106,6 +105,22 @@ class SetOperationUnitTests { .containsExactly(Document.parse("{\"$set\" : {\"totalHomework\": { \"$sum\" : \"$homework\" }}}")); } + @Test // GH-4933 + void rendersTargetFieldReferenceCorrectly() { + + assertThat( + SetOperation.builder().set("totalHomework").toValueOf("homework").toPipelineStages(contextFor(Scores.class))) + .containsExactly(Document.parse("{\"$set\" : {\"totalHomework\": \"$homework\" }}")); + } + + @Test // GH-4933 + void rendersMappedTargetFieldReferenceCorrectly() { + + assertThat(SetOperation.builder().set("totalHomework").toValueOf("homework") + .toPipelineStages(contextFor(ScoresWithMappedField.class))) + .containsExactly(Document.parse("{\"$set\" : {\"totalHomework\": \"$home_work\" }}")); + } + @Test // DATAMONGO-2331 void exposesFieldsCorrectly() {